美文网首页工作生活
Spring事物传播级别NESTED和REQUIRES_NEW的

Spring事物传播级别NESTED和REQUIRES_NEW的

作者: 小李子Levy | 来源:发表于2019-06-30 01:04 被阅读0次

    今天在看Spring事务的处理,注意到了传播级别这个参数,一共是以下几个值

    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);
    

    其他几种不用多说,详细可以戳这里,主要是结合自己的分析,感觉网上说到REQUIRES_NEWNESTED的区别时,描述大都不太准确,所以做下记录
    先看如下代码

    class A {
        public void invoke() {
            try {
                new B().invoke();
            catch (Exception e) {
                new C().invoke();
            }
            // 此处可能还有其他业务代码
            ...
        };
    }
    
    class B {
        public void invoke() {};
    }
    
    class C {
        public void invoke() {};
    }
    

    不论使用REQUIRES_NEW或是NESTED,在调用B的invoke时如果发生异常,都能正确完成业务逻辑

    • REQUIRES_NEW执行到B时,A事物被挂起,B会新开了一个事务进行执行,B发生异常后,B中的修改都会回滚,然后外部事物继续执行
    • NESTED执行到B时,会创建一个savePoint,如果B中执行失败,会将数据回滚到这个savePoint

    重点来了,如果B处正常执行,就会产生区别了

    • REQUIRES_NEW如果B正常执行,则B中的数据在A提交之前已经完成提交,其他线程已经可见其修改,这就意味着可能有脏数据的产生;同时,如果接下来A的其他逻辑发生了异常,A回滚,但是B已经完成提交,不会回滚了。当然,如果A接下来的逻辑没有相关要求,那就无所谓了
    • NESTED如果B正常执行,此时B中的修改并不会立即提交,而是在A提交时一并提交,如果A下面的逻辑中发生异常,A回滚时,B中的修改也会回滚,就可以避免上述情况的发生

    相关文章

      网友评论

        本文标题:Spring事物传播级别NESTED和REQUIRES_NEW的

        本文链接:https://www.haomeiwen.com/subject/joqvcctx.html