spring中事务配置REQUIRES_NEW不起作用

来源:互联网 发布:监控摄像头客户端软件 编辑:程序博客网 时间:2024/06/01 08:25
先看service层的代码,我们希望for中的每一次循环都作为一个事务处理,如果一次循环失败,不希望影响下一次循环,因此使用了try/catch。
public class ServiceA implements IServiceA {public void saveXXX() {for(int i=0;i<10;i++){try {processXXX();} catch (Exception e) {//logger.error(this,e);}}}public void processXXX() {//update table A//update table B}}

由于希望每次循环都作为一个新事务处理,因此将相应的事务传播属性配置为REQUIRES_NEW,事务事务配置如下:

<!-- 配置事务的传播特性 --><tx:advice id="crv_txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="add*" propagation="REQUIRED"/><tx:method name="save*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="do*" propagation="REQUIRED"/>  <tx:method name="process*" propagation="REQUIRES_NEW"/></tx:attributes></tx:advice><!-- 那些类的哪些方法参与事务 --><aop:config><aop:pointcut id="crv_allManagerMethod_01" expression="execution(* com.wisoft.crv.bo.*.*(..))"/><aop:advisor pointcut-ref="crv_allManagerMethod_01" advice-ref="crv_txAdvice"/></aop:config>

实际运行的时候发现processXXX()并未作为新事务处理,难道对processXXX()的事务配置不起作用?

分析后发现并不是对processXXX()的事务配置不起作用,而是代码没有正确使用导致事务不生效。spring的事务依赖的是AOP特性,所以代码运行的时候实际上运行的是AOP代理对象,只有调用代理对象的方法才能享受spring事务的便捷。


针对这个问题的解决,可以在ServiceA中注入自己来解决(准确来说注入的是spring AOP生成的代理对象),参考代码如下:

public class ServiceA implements IServiceA {private IServiceA serviceA;public void saveXXX() {for(int i=0;i<10;i++){try {serviceA.processXXX();} catch (Exception e) {//logger.error(this,e);}}}public void processXXX() {//update table A//update table B}}
原创粉丝点击