zoukankan      html  css  js  c++  java
  • Spring3的Transaction事务的传播特性和隔离级别

    网上百度复制的,有点乱,下面是事物传播特性和隔离级别的配置,以前分开看一直疑惑,估做此搬运

    事物的传播特性

    来自:http://blog.163.com/girl_lihuiyue@126/blog/static/180696212013112345629678/

    • 首先在/WEB-INF/applicationContext.xml添加以下内容:
    <!-- 配置事务管理器 -->
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    
       <property name="sessionFactory">
    
           <ref bean="mySessionFactory"/>
    
       </property>
    
    </bean>
    

    注:这是作为公共使用的事务管理器Bean。这个会是事先配置好的,不需各个模块各自去配。

    • 下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。

    首先就是配置事务的传播特性,如下:

    <!--  配置事务传播特性 -->
    
    <tx:advice id="TestAdvice" transaction-manager="transactionManager">
    
        <tx:attributes>
    
          <tx:method name="save*" propagation="REQUIRED"/>
    
          <tx:method name="del*" propagation="REQUIRED"/>
    
          <tx:method name="update*" propagation="REQUIRED"/>
    
          <tx:method name="add*" propagation="REQUIRED"/>
    
          <tx:method name="find*" propagation="REQUIRED"/>
    
          <tx:method name="get*" propagation="REQUIRED"/>
    
          <tx:method name="apply*" propagation="REQUIRED"/>
    
        </tx:attributes>
    
    </tx:advice>
    
    <!--  配置参与事务的类 -->
    
    <aop:config>
    
    <aop:pointcut id="allTestServiceMethod" expression="execution(* com.test.testAda.test.model.service.*.*(..))"/>
    
    <aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" />
    
    </aop:config>

    需要注意的地方:

    (1) advice(建议)的命名:由于每个模块都会有自己的Advice,所以在命名上需要作出规范,初步的构想就是模块名+Advice(只是一种命名规范)。

    (2) tx:attribute标签所配置的是作为事务的方法的命名类型

             如<tx:method name="save*" propagation="REQUIRED"/>

            其中*为通配符,即代表以save为开头的所有方法,即表示符合此命名规则的方法作为一个事务。

            propagation="REQUIRED"代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

    (3) aop:pointcut标签配置参与事务的类,由于是在Service中进行数据库业务操作,配的应该是包含那些作为事务的方法的Service类。

           首先应该特别注意的是id的命名,同样由于每个模块都有自己事务切面,所以我觉得初步的命名规则因为 all+模块名+ServiceMethod。而且每个模块之间不同之处还在于以下一句:

           expression="execution(* com.test.testAda.test.model.service.*.*(..))"

           其中第一个*代表返回值,第二*代表service下子包,第三个*代表方法名,“(..)”代表方法参数。

    (4) aop:advisor标签就是把上面我们所配置的事务管理两部分属性整合起来作为整个事务管理。

    图解:

    image

    隔离级别配置

    来自:http://www.cnblogs.com/hoojo/archive/2011/04/15/2017447.html

    MyBatis3整合Spring3的Transaction事务处理

          正如第二版,Spring 仅支持 iBatis2。那么我们就想将 MyBatis3 的支持加入到 Spring3.0(参考 Spring 的 Jira 的问题)中。

    不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。因为Spring开发团队不想发布一个基于非发行版的MyBatis的整合支持,

    那么 Spring官方的支持就不得不等到至少 3.1 版本了。要在 Spring 中支持 MyBatis,MyBatis 社区认为现在应该是自己团结贡献者和有兴趣的人

    一起来开始进行 Spring 和 MyBatis 整合的时候了。 这个小类库就来创建丢失的粘贴 Spring 和 MyBtatis 这两个流行框架的胶水。

    减少用户不得不来配置MyBatis和Spring 3.X上下文环境的样板和冗余代码。 它还透明地增加了 Spring对 MyBatis 事务的支持。

          所以尽管MyBatis3提供了对Spring的整合,但是org.springframework.jdbc.datasource.DataSourceTransactionManager这个事务管理器还是不支持

    aop的事务管理方式,如果你还想设置你的事务的隔离级别、只读(PROPAGATION_REQUIRED、ISOLATION_DEFAULT、readOnly、timeout)。

    那么你可以使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean这个事务拦截器的代理工厂。它还是可以完成的,但是当然不会

    有HibernateTransactionManager那样的完美,因为DataSourceTransactionManager不能使用aop来管理我们的事务。

    基本配置如下:

    <!-- 配置事务管理器,注意这里的dataSource和SqlSessionFactoryBean的dataSource要一致,不然事务就没有作用了 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
     
    <!-- 配置事务的传播特性 -->
    <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="add*">PROPAGATION_REQUIRED</prop>
                <prop key="edit*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="del*">PROPAGATION_REQUIRED</prop>
                <prop key="*">readOnly</prop>
            </props>
        </property>
    </bean>

    然后,你需要配置的是对那个类的进行拦截器事务管理,就就需要设置这个接口的parent属性为baseTransactionProxy,target是该接口的实现类。如下:

    <!-- 为AccountBiz接口配置事务拦截器,baseTransactionProxy是事务拦截器,在Controller中获取这个对象 -->
    <bean id="accountBiz" parent="baseTransactionProxy">
        <!-- 设置target,也就是AccountBiz的实现类 -->
        <property name="target" ref="accountBizImpl"/>
    </bean>

    上面的accountBiz是一个接口,它的实现类的id是accountBizImpl。然后你在Struts或SpringMVC中注入accountBiz这个接口即可使用里面的方法了。

    糟糕的是,你需要为所有需要事务管理的类或接口都要进行这个配置!也许你可以配置一个BaseBiz的parent是baseTransactionProxy,然后所有要进行

    事务管理的接口或类,继承或实现BaseBiz这个接口。不妨可以尝试一番!

  • 相关阅读:
    程序员的希波克拉底誓言[精华]
    怎样成为优秀的软件模型设计者
    C#中Delegate浅析与思考
    程序员是一个美好的职业[精华]
    hdu 1421(搬寝室)
    hdu 4022(map一对多)
    hdu 1114(完全背包)
    hdu 1159(最长公共子序列)
    hdu 2844(多重背包)
    hdu 1257(最长递增子序列)
  • 原文地址:https://www.cnblogs.com/dieyf/p/4092114.html
Copyright © 2011-2022 走看看