博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring配置和注解事务同时存在导致的事务嵌套
阅读量:5914 次
发布时间:2019-06-19

本文共 2840 字,大约阅读时间需要 9 分钟。

详见:

首先先看配置文件:

 

[html] 

 

  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,关于事务传播级别,请参照,那么在注解事务中我们定义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://lvgpx.baihongyu.com/

你可能感兴趣的文章
使用 JFreeChart来创建基于web的图表
查看>>
Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置
查看>>
马哥2016全新Linux+Python高端运维班-Linux用户创建及权限管理
查看>>
对C++中string类型的总结
查看>>
写给喜欢用Block的朋友(ios Block)
查看>>
从Mysql EXPLAIN探寻数据库查询优化1
查看>>
Linux 挂载ntfs文件系统技巧
查看>>
Nagios汉化
查看>>
《Java从入门到放弃》文章目录
查看>>
随机森林入门
查看>>
目标管理,计划管理,时间管理
查看>>
JAVA中wait和notify,sleep
查看>>
ubuntu下设置开机自启动项
查看>>
699的高性价比,大神F1极速版体验一览
查看>>
开放与互联:透明工厂如何引领中国制造升级?
查看>>
高德地图增速超百度一倍 秘密研发新一代一体化引擎
查看>>
BAT挺进移动竞争时代 红包引发入口之争
查看>>
配置Oracle RAC注意事项
查看>>
windows 使用debug命令查看主板生产日期
查看>>
我的友情链接
查看>>