编写程序的时候,在一个方法的方法体中调用另一个方法,似乎是司空见惯的事情。但如果这两个方法都涉及到事务,这时候就需要事务传播机制来协调内外事务的运行方式了。
例如下面的例子:
method1(){
doSomethings();
method2();
doSomeOtherThings();
}
method1调用了method2,这时候就涉及到了事务传播机制,注意这里的事务传播机制的设置对象是method2。为了便于书写,我们假设method1如果有事务则记为事务1,method2如果有事务则记为事务2。
1. PROPAGATION_REQUIRED 需要事务
required
如果method1没有事务,则method2会运行在自己的事务里。如果method1有事务,则method2加入到method1的事务中。
这时候如果有事务,则method1和method2处于同一事务中,提交与回滚机制满足单个事务的特点。
2. PROPAGATION_REQUIRES_NEW 需要新事务
requires_new
不论method1有没有事务,method2都会开启一个新事务。如果method1有事务,则将method1的事务挂起。
这时,如果事务1和事务2都存在,则事务2的结果独立于事务1,也就是说事务2的回滚不影响事务1的执行,事务2的提交也不依赖于事务1。
3. PROPAGATION_SUPPORTS 支持事务
method1开启事务,则method2也在该事务中运行。method1没有事务,则method2按照无事务方式运行。
4. PROPAGATION_NOT_SUPPORTED 不支持事务
method2只能无事务运行。如果method1有事务,则把当前事务挂起。
5. PROPAGATION_NESTED 嵌套事务
nested
method2会在新建的事务中运行,如果method1有事务,则method2的事务嵌套进method1的事务中。
这时,如果事务1和事务2都存在,则事务2的回滚不影响事务1的结果,但事务1的回滚会引发事务2同时回滚,并且事务1提交时事务2才能提交。(可以想象成地上层叠铺了两张地毯,你卷起来上层的地毯并不会影响下面的地毯,但你卷起来下面的地毯肯定会同时将上面的地毯一块卷起来。)
6. PROPAGATION_MANDATORY 强制要求事务
method2强制要求method1将事务传播过来。如果method1没有提供事务,则报错。
7. PROPAGATION_NEVER 强制要求非事务
method2拒绝method1将事务传播过来。如果method1有事务,则报错。






网友评论