spring事务REQUIRED、REQUIRES_NEW、NE

2022-01-24  本文已影响0人  M_lear

REQUIRED(默认的传播机制):

REQUIRES_NEW:

NESTED

REQUIRED

一个类的A方法调用另一个类的B方法。
假设在A方法存在一个当前事务,B方法的事务传播机制为REQUIRED,则B方法会合并到A方法的事务里执行。

A、B任意一个方法异常(默认是RuntimeException和Error)都会导致A、B的操作被回滚。

Spring事务管理器不会吞异常。
B异常后会抛给A,A如果没有catch这个异常,会继续向上抛。如果A catch住了,Spring事务管理器会替A向上抛一个UnexpectedRollbackException。总之,一旦A、B回滚,A的调用方一定能收到一个异常感知到回滚。

REQUIRES_NEW

一个类的A方法调用另一个类的B方法。
假设在A方法存在一个当前事务,B方法的事务传播机制为REQUIRES_NEW,则B方法会新建一个事务并把A所在的事务挂起。A事务等到B事务执行完后,恢复执行。

这种传播机制下,需要小心死锁问题。A事务被挂起了,如果B事务要加的锁被A占用了就会发生死锁。

NESTED

一个类的A方法调用另一个类的B方法。
假设在A方法存在一个当前事务,B方法的事务传播机制为NESTED,则B方法会作为A方法所在事务的一个子事务执行。

子事务的底层实现:B方法执行前会在A所在事务中创建一个savepoint,B异常后回滚到此savepoint。

以上结论都是实测得出,测试代码

上一篇下一篇

猜你喜欢

热点阅读