美文网首页
@Transactional的propagation参数

@Transactional的propagation参数

作者: seawish | 来源:发表于2019-08-14 18:20 被阅读0次

Spring事务管理中@Transactional的propagation参数。

Required

支持当前已经存在的事务,如果还没有事务,就创建一个新事务。传播性被设为了REQUIRED,注意,这是默认值,也即不进行该参数配置等于配置成REQUIRED。

Class A {
    @Transactional(propagation=propagation.REQUIRED)
    public void funA {
        B b = new B();
        b.funb();
    }
}
 
Class B {
    @Transactional(propagation=propagation.REQUIRED)
    public void funb { 
     // doSomeThing
    }
}

对于这样的配置,如果funb过程中发生异常需要回滚,那么funa中所进行的所有数据库操作也将同时被回滚,因为这两个方法使用了同一个事务

MANDATORY

支持当前已经存在的事务,如果还没有事务,就抛出一个异常。

Class A {
    @Transactional(propagation=propagation.MANDATORY)
    public void funA {
        B b = new B();
        b.funb();
    }
}
 
Class B {
    @Transactional(propagation=propagation.REQUIRED)
    public void funb { 
     // doSomeThing
    }
}
1565171829146.png

NESTED

如果在同一个service类中定义的两个方法, 内层REQUIRES_NEW并不会开启新的事务,save和update中回滚都会导致整个事务的回滚
如果在不同的service中定义的两个方法, 内层REQUIRES_NEW会开启新的事务,并且二者独立,事务回滚互不影响。

用例参考:https://blog.csdn.net/ID19870510/article/details/78883741

REQUIRES_NEW

由于这种行为,只有在被调用方法中的数据库操作需要保存到数据库中,而不管覆盖事务的结果如何时,才应该使用 REQUIRES_NEW 事务属性。比如,假设尝试的所有股票交易都必须被记录在一个审计数据库中。出于验证错误、资金不足或其他原因,不管交易是否失败,这条信息都需要被持久化。如果没有对审计方法使用 REQUIRES_NEW 属性,审计记录就会连同尝试执行的交易一起回滚。使用 REQUIRES_NEW 属性可以确保不管初始事务的结果如何,审计数据都会被保存

参考文献

相关文章

网友评论

      本文标题:@Transactional的propagation参数

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