PROPAGATION_REQUIRES_NEW PROPAGATION_NESTED 区别

  1. PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于,

  2. PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED

  3. 则是外部事务的子事务, 如果外部事务 commit, 潜套事务也会被 commit,

  4. 这个规则同样适用于 roll back

  5. 现在的情况就变得比较复杂了, ServiceB.methodB() 的事务属性被配置为 PROPAGATION_NESTED, 此时两者之间又将如何协作呢? ServiceB#methodB 如果 rollback, 
    那么内部事务(即 ServiceB#methodB) 将回滚到它执行前的 SavePoint 而外部事务(即 ServiceA#methodA) 可以有以下两种处理方式:
    
    a、捕获异常,执行异常分支逻辑
    
    void methodA() {
    
            try {
    
                ServiceB.methodB();
    
            } catch (SomeException) {
    
                // 执行其他业务, 如 ServiceC.methodC();
    
            }
    
        }
    这种方式也是嵌套事务最有价值的地方, 它起到了分支执行的效果, 如果 ServiceB.methodB 失败, 那么执行 ServiceC.methodC(), 而 ServiceB.methodB 已经回滚到它执行之前的 SavePoint, 
    所以不会产生脏数据(相当于此方法从未执行过), 这种特性可以用在某些特殊的业务中, 而 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 都没有办法做到这一点。
    
    b、 外部事务回滚/提交 代码不做任何修改, 那么如果内部事务(ServiceB#methodB) rollback, 那么首先 ServiceB.methodB 回滚到它执行之前的 SavePoint(在任何情况下都会如此), 
    外部事务(即 ServiceA#methodA) 将根据具体的配置决定自己是 commit 还是 rollback

     


版权声明:本文为ma_ru_long原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。