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
属性可以确保不管初始事务的结果如何,审计数据都会被保存
网友评论