• Spring有几种事务处理方式?举例说明


    1、用原始的transactionfactorybean的,代理dao事务处理
    2、用aop:config声明要进行事务增强的切面,用tx:advice声明具体方法的事务属性,及应用到的事务管理器
    3、使用@transactional注解配置声明事务
    如有一代表用户的域对象user:
    package com.domain;
    import java.io.serializable;
    public class user implements serializable{
        private int user_id;
        private string user_name;
        private string user_password;
        private string user_desc;
    ....//省略set、get方法
    }
    user的数据库操作接口:
    package com.dao;
    import com.domain.user;
    public interface userdao {
        public void adduser(user user);
    }
    有一继承spring jdbc支持类的userdao接口实现类,实现添加一个user的方法。它需要注入一个spring jdbc模板类jdbctemplate:
    package com.dao.jdbc;
    import com.domain.user;
    import com.dao.userdao;
    import org.springframework.jdbc.core.support.jdbcdaosupport;
    public class userjdbcdao extends jdbcdaosupport implements userdao{
        public void adduser(user user){
             string  sql =
             "insert into user(user_name,user_password,user_desc) values(?,?,?)";
            object[] params = new object[]{
               user.getuser_name(),
               user.getuser_password(),
               user.getuser_desc()
            } ;
            this.getjdbctemplate().update(sql, params);
        }
    }
    以上dao层的类对应的bean的基本配置文件app_dao.xml如下(数据源的属性放入了外部的资源文件"prop.properties"):
        <bean class="org.springframework.beans.factory.config.propertyplaceholderconfigurer">
            <property name="location" value="classpath:prop.properties"/>
        </bean>
    <!--数据源-->
        <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"
         destroy-method="close">
            <property name="driverclassname" value="${jdbc.driverclassname}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    <!--spring jdbc模板bean,它注入了上面的数据源-->
        <bean id="jdbctemplate" class="org.springframework.jdbc.core.jdbctemplate">
            <property name="datasource" ref="datasource"/>
        </bean>
    <!--user数据操作的bean声明,它注入了上面的spring jdbc模板bean:jdbctemplate-->
        <bean id="userjdbcdao"
        class="com.dao.jdbc.userjdbcdao">
     <property name="jdbctemplate" ref="jdbctemplate"/>
        </bean>
    </beans>

    这里我简单地模拟业务类(业务接口userservice省略):
    package com.service.impl;
    import com.dao.userdao;
    import com.domain.user;
    import com.service.userservice;
    public class userserviceimpl implements userservice {
        private userdao userdao;
        public void setuserdao(userdao userdao){
            this.userdao = userdao;
        }
        public void adduser(user user){
            this.userdao.adduser(user);
        }
    }
    为了在业务类中使用事务管理功能,有如下几个方法:
    1、用原始的transactionfactorybean的app.xml基本配置:
        <import resource="classpath:app_dao.xml"/><!--导入dao层的配置-->
    <!--spring jdbc的事务管理bean,引入了dbcp数据源-->
        <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
            <property name="datasource" ref="datasource"/>
        </bean>
    <!--业务类bean-->
        <bean id="userserviceimpltarget" class="com.service.impl.userserviceimpl">
            <property name="userdao" ref="userjdbcdao"/>
        </bean>
    <!--应用原始的transactionfactorybean进行事务管理bean的声明-->
        <bean id="userserviceimpl"class="org.springframework.transaction.interceptor.transactionproxyfactorybean">
            <property name="transactionmanager" ref="txmanager"/><!--指定事务管理bean-->
            <property name="target" ref="userserviceimpltarget"/><!--指定业务bean-->
            <property name="transactionattributes"><!--事务的属性设置列表-->
                <props>
                    <prop key="add*">propagation_required,isolation_serializable</prop>
                    <!--设置事务为只读时,添加数据将会产生异常-->
                    <!--<prop key="add*">propagation_required,isolation_serializable,readonly</prop>-->
                </props>
            </property>
        </bean>
    测试:
    ......
    userserviceimpl usi = (userserviceimpl)ctx.getbean("userserviceimpl");
    ......
    2、用tx/aop命名空间配置:
    <?xml version="1.0" encoding="utf-8"?>
    <beans .....
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsp:schemalocation="http://www.springframework.org/schema/beans
        ...........
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
        <import resource="classpath:app_dao.xml"/>
        <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
            <property name="datasource" ref="datasource"/>
        </bean>

        <bean id="userserviceimpltarget" class="com.service.impl.userserviceimpl">
            <property name="userdao" ref="userjdbcdao"/>
        </bean>
    <!--应用tx/aop命名空间进行事务声明-->
    <!--用tx:advice声明具体方法的事务属性,及应用到的事务管理器-->
        <tx:advice id="txadvice" transaction-manager="txmanager">
            <tx:attributes>
                <tx:method name="add*" read-only="true"/>
            </tx:attributes>
        </tx:advice>
    <!--用aop:config声明要进行事务增强的切面-->
        <aop:config>
            <aop:pointcut id="servicemethod"
            expression="execution(* com.service..add*(..))"/>
            <aop:advisor pointcut-ref="servicemethod" advice-ref="txadvice"/>
        </aop:config>
    </beans>
    测试:
    .......
    userservice usi = (userservice)ctx.getbean("userserviceimpltarget");
    ..........
    3、使用@transactional注解配置声明事务(最简单实用的方法):
    在需要事务管理增强的业务类加入@transactional注解标记,如:
    ......
    import org.springframework.transaction.annotation.transactional; //注解式事务
    @transactional(readonly=false) //对业务类进行事务增强的标注
    public class userserviceimpl implements userservice {
    ...........
    }
    再在配置文件中用<tx:annotation-driven>驱动自动为标记@transactional注解的类织入事务管理增强:
     <import resource="classpath:app_dao.xml"/>
        <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
            <property name="datasource" ref="datasource"/>
        </bean>
        <!--注解式事务配置驱动-->
        <tx:annotation-driven transaction-manager="txmanager" proxy-target-class="true"/>
    <!--业务类bean的实现类标注了@transactional注解,所以会被
    tx:annotation-driven注解驱动自动织入事务增强-->
        <bean id="userservice" class="com.service.impl.userserviceimpl">
            <property name="userdao" ref="userjdbcdao"/>
        </bean>
    测试:
    .........
    userserviceimpl usi = (userserviceimpl)ctx.getbean("userservice");

  • 相关阅读:
    Oracle 数据块,文件块转换,查看数据块对像
    逆向与汇编视频(36课) IDA 使用
    VC++消息钩子编程
    VS2008中opengl配置
    BSP技术详解3有图有真相
    BSP技术详解1有图有真相
    oracle 跟踪文件和转储命令
    BSP技术详解2有图有真相
    Recognizing and Learning Object Categories 连接放送
    自学MVC看这里——全网最全ASP.NET MVC 教程汇总
  • 原文地址:https://www.cnblogs.com/soundcode/p/1910302.html
Copyright © 2020-2023  润新知