Spring事务的传播行为(二)

事物的七种形式中,常用的两种方式,基本开发中也就用到这2种

(1)PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

  // 事务属性 PROPAGATION_REQUIRED methodA{ …… methodB(); …… }123456 // 事务属性 PROPAGATION_REQUIRED methodB{ …… }   使用 spring 声明式事务, spring 使用 AOP 来支持声明式事务,会根据事务属性,自动在方法调用之前决 定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。  

Spring保证在methodB方法中所有的调用都获得到一个相同的连接。在调用methodB时,没有一个存 在的事务,所以获得一个新的连接,开启了一个新的事务。 单独调用MethodA时,在MethodA内又会调用MethodB。

调用 MethodA 时,环境中没有事务,所以开启一个新的事务 . 当在 MethodA 中调用 MethodB 时,环境中 已经有了一个事务,所以methodB 就加入当前事务。 (2 ) PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。(常用在日志中,A中失败了,并不影响B中,继续打印日志) // 事务属性 PROPAGATION_REQUIRED methodA(){ doSomeThingA(); methodB(); doSomeThingB(); } // 事务属性 PROPAGATION_REQUIRES_NEW methodB(){ …… } A为外层事务,B 称为内层事务。从上面的代码可以看出,A 与B 是两个独立的事 务,互不相干。 如果 methodA 方法在调用 methodB 方法后的 doSomeThingB方法失败了,而 methodB 方法所做的结果依然被提交。而除了 methodB 之外的其它代 码导致的结果却被回滚了。使用PROPAGATION_REQUIRES_NEW, 需要使用 JtaTransactionManager 作为事务管理器。
上一篇:Microsoft Visual C++ 14.0 is required


下一篇:大屏可视化项目之vue3-seamless-scroll无缝滚动组件(一)——基本使用