编写程序的时候,在一个方法的方法体中调用另一个方法,似乎是司空见惯的事情。但如果这两个方法都涉及到事务,这时候就需要事务传播机制来协调内外事务的运行方式了。
例如下面的例子:
method1(){
doSomethings();
method2();
doSomeOtherThings();
}
method1
调用了method2
,这时候就涉及到了事务传播机制,注意这里的事务传播机制的设置对象是method2
。为了便于书写,我们假设method1
如果有事务则记为事务1,method2
如果有事务则记为事务2。
1. PROPAGATION_REQUIRED 需要事务

如果method1
没有事务,则method2
会运行在自己的事务里。如果method1
有事务,则method2
加入到method1
的事务中。
这时候如果有事务,则method1和method2处于同一事务中,提交与回滚机制满足单个事务的特点。
2. PROPAGATION_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 嵌套事务

method2
会在新建的事务中运行,如果method1
有事务,则method2
的事务嵌套进method1
的事务中。
这时,如果事务1和事务2都存在,则事务2的回滚不影响事务1的结果,但事务1的回滚会引发事务2同时回滚,并且事务1提交时事务2才能提交。(可以想象成地上层叠铺了两张地毯,你卷起来上层的地毯并不会影响下面的地毯,但你卷起来下面的地毯肯定会同时将上面的地毯一块卷起来。)
6. PROPAGATION_MANDATORY 强制要求事务
method2
强制要求method1
将事务传播过来。如果method1
没有提供事务,则报错。
7. PROPAGATION_NEVER 强制要求非事务
method2
拒绝method1
将事务传播过来。如果method1
有事务,则报错。
网友评论