zoukankan      html  css  js  c++  java
  • (转)spring 注解 事务,声明事务共存的情况下,先后顺序 order

    很不错的文章:

    首先先看配置文件:

    [html] view plain copy
     
     
    1. <!-- hibernate -->  
    2.     <bean id="sessionFactory"  
    3.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
    4.         <property name="dataSource" ref="dataSource" />  
    5.         <property name="hibernateProperties">  
    6.             <props>  
    7.                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
    8.                 <prop key="hibernate.show_sql">true</prop>  
    9.                 <prop key="hibernate.format_sql">true</prop>  
    10.                 <prop key="connection.autoReconnect">true</prop>  
    11.                 <prop key="connection.autoReconnectForPools">true</prop>  
    12.                 <prop key="connection.is-connection-validation-required">true</prop>  
    13.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
    14.             </props>  
    15.         </property>  
    16.         <property name="mappingDirectoryLocations">  
    17.             <list>  
    18.                 <value>classpath*:*oddtech/bean</value>  
    19.             </list>  
    20.         </property>  
    21.     </bean>  
    22.   
    23.     <!-- 事務管理 -->  
    24.     <bean id="txManager"  
    25.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
    26.         <property name="sessionFactory" ref="sessionFactory" />  
    27.     </bean>  
    28.     <!-- 註解式事務的支持 -->  
    29.     <tx:annotation-driven transaction-manager="txManager"  order="0"/>  
    30.     <!-- 服務事務註冊切面 -->  
    31.     <aop:config >  
    32.         <aop:pointcut expression="execution(* oddtech.service.impl.*.*(..))"  
    33.             id="txPoint"  />  
    34.         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"  order="1"/>  
    35.     </aop:config>  
    36.   
    37.       
    38.   
    39.   
    40.     <tx:advice transaction-manager="txManager" id="txAdvice">  
    41.         <tx:attributes >  
    42.             <tx:method name="find*" propagation="REQUIRED" read-only="true"   
    43.                 rollback-for="Exception" />  
    44.             <tx:method name="select*" propagation="REQUIRED" read-only="true"  
    45.                 rollback-for="Exception" />  
    46.             <tx:method name="insert*" propagation="REQUIRED"    
    47.                 rollback-for="Exception" />  
    48.             <tx:method name="delete*" propagation="REQUIRED"  
    49.                 rollback-for="Exception" />  
    50.             <tx:method name="update*" propagation="REQUIRED"   
    51.                 rollback-for="Exception" />  
    52.             <tx:method name="modify*" propagation="REQUIRED"  
    53.                 rollback-for="Exception" />  
    54.             <tx:method name="*" read-only="true"  
    55.                 rollback-for="Exception" />  
    56.         </tx:attributes>  
    57.     </tx:advice>  


    当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,相当于在执行new Test().insert() 方法执行2次AOP切面。那么我们需要通过order 属性去定义AOP切面的先后执行顺序。 order越小,在AOP的chain 中越靠前,越先执行。(chain模式)

    所以 我们需要在<tx:annotation-driven transaction-manager="txManager"  order="0"/>中加入order属性为0,<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"  order="1"/>加入order 属性为1.那么他们两个的执行顺序如下:

    。这样就属于事务嵌套

    那么我们再看上边说的例子:当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,那么我们想让insert 方法只读,read-only=true,那么我们需要这样去定义:@Transactional(readOnly = true,propagation=Propagation.REQUIRED),为什么呢?

    在声明事务中,我们对insert 的事务传播级别定义为:REQUIRED,关于事务传播级别,请参照http://blog.csdn.net/feng27156/article/details/8534609,那么在注解事务中我们定义REQUIRED 的事务。声明事务在使用注解定义的事务级别。

    除非在特殊的情况下,注解事务不要和声明事务有冲突。声明事务定义的是统一的规则,如果你想让某一个方法有特殊的事务传播机制的话,那么不要和统一的规则有冲突。

    <tx:method name="*" read-only="true" rollback-for="Exception" />

    按照規則,定義一個test方法,加入:@Transactional定義。则test 方法爲read-only=false,propagation=REQUIRED。這是默認的。統一規則<tx:method name="*" read-only="true" rollback-for="Exception" />不會對test方法的註解事務衝突。

    转自:http://blog.csdn.net/feng27156/article/details/8740223

  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/latteyan/p/7602453.html
Copyright © 2011-2022 走看看