事务嵌套问题总结-rollback-only异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务嵌套问题总结-rollback-only异常相关的知识,希望对你有一定的参考价值。

参考技术A REQUIRES_NEW :不管是否存在事务,总会创建一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。 

NESTED: 如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。 回滚的时候会先校验有无设置保存点 status.hasSavepoint()

补充: invokeWithinTransaction 事务框架执行流程大概步骤:

1. 获取事务属性

2. 获取事务管理器

3. 获取需要事务的方法名称

5. 获取该方法上事务的信息

6. 目标方法执行

7. 事务回滚

8. 清除事务信息

9. 事务提交

spring嵌套事务探究

1.serviceA 调用 serviceB(另起事务) serviceA在 serviceB正常执行后抛异常,serviceB
事务不回滚,serviceA事务回滚



2.serviceA 调用 serviceB(另起事务),serviceB方法里抛出异常,但在serviceA 里trycatch serviceB,serviceB事务回滚,serviceA事务不回滚



3.serviceA 调用 serviceB serviceA在 serviceB正常执行后抛异常,但被trycatch,serviceA及serviceB都不回滚



4.serviceA 调用 serviceB , serviceB执行中报错,但在serviceB被trycatch,serviceA及serviceB都不回滚



5.serviceA 调用 serviceB , serviceB执行中报错,向上抛出,在serviceA 中trycatch serviceB ,serviceA及serviceB都回滚(只要嵌套事务回滚,外层事务也回滚)

以上是关于事务嵌套问题总结-rollback-only异常的主要内容,如果未能解决你的问题,请参考以下文章

spring 嵌套事务问题

嵌套事务总结

嵌套事务总结

Transaction rolled back because it has been marked as rollback-only

嵌套事务 DbContext SaveChanges 引发异常

Transaction rolled back because it has been marked as rollback-only