事物的七种形式中,常用的两种方式,基本开发中也就用到这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 作为事务管理器。