Spring3的Transaction事务的传播特性和隔离级别

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

事物的传播特性spring

来自: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。这个会是事先配置好的,不需各个模块各自去配。express

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

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

<!--  配置事务传播特性 -->
<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>

须要注意的地方:app

(1) advice(建议)的命名:因为每一个模块都会有本身的Advice,因此在命名上须要做出规范,初步的构想就是模块名+Advice(只是一种命名规范)。框架

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

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

        其中*为通配符,即表明以save为开头的全部方法,即表示符合此命名规则的方法做为一个事务。url

        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这个接口。不妨能够尝试一番!

相关文章
相关标签/搜索