vlambda博客
学习文章列表

记录一次spring事务失效问题

最近在用到Spring事务时候出现了一点问题,折腾了很久才发现问题,特此记录下来,以供大家借鉴,有什么问题欢迎留言。然后在网上看了一些关于Spring事务管理的文章,参考的文章如下:

  • Spring事务机制详解

  • Spring事务配置的五种方式

  • Spring中的事务管理实例详解

  • Spring事务管理(详解和实例)

事务的ACID,Spring事务管理,传播行为和隔离级别具体概念就不一一介绍了,直接描述我遇到的问题。


在近期开发一个项目中,遇到了批量操作,就是对一个人员列表做批量业务操作,我的本意是一个人员一个人员下发,彼此有错不会影响其他人员的业务。核心代码如下:

代码正常情况下是没有问题的,但是当我调试异常情况,比如第二个人有异常,这时候第一个人居然回滚了,我很纳闷,在addByWorker方法上也加了Propagation.REQUIRES_NEW,但是就是全部回滚了,大家可以先想想为什么?       


思索很久,才在网上找到了一个帖子:

https://blog.csdn.net/duanlb_001/article/details/70159694

感谢博主提供的方案,最终解决了问题。

先看下解决方案:

没错就是加了workerTaskService,把addByWorker方法写到了另一个Service里,这样每个人的事务就不会有影响,每个人都可以正常提交, 一个人有问题,其他人可以正常入库不会回滚。


其实Spring的事务传播级别是类级别的,如果类中的一个方法使用的某一个类型的事务,那么整个类的事务都是一种事务,而且回滚级别也是类级别的。Spring事务认定级别以类为单位,所以只有退出类的调用时,对会触发事务的提交或回滚。所以即使在同个类中调用不同的事务级别,也是没有意义的。