你的位置:首页 > Java教程

[Java教程]Spring事务重点


Spring事务最重要三种传播

  首先声明本文只讨论这三种事务传播,分别是 PROPAGATION_REQUIRED,PROPAGATION_REQUIRED_NEW,PROPAGATION_NESTED。

  背景:我们在设计业务时不可能所有的业务操作都是自己写完,放在一个方法中,有时候需要调用其他方法,其他同事的代码。这种情况下需要我们考虑事务的传播性。

A方法事务是REQUIRED,我们讨论的对象是B方法调用应该采用哪种事务

  1. PROPAGATION_REQUIRED,最常使用的事务。场景:业务A方法调用B方法。A已经是REQUIRED事务,B采用PROPAGATION_REQUIRED,分为两种情况考虑,第一种:A成败对B有没有影响,答案是有,A方法发生异常引起回滚操作会影响B方法的操作结果无效。第二种:B的成败对A有没有影响。答案是有,B方法发生异常引起回滚操作会影响A方法的操作结果无效。B和A是同失败同成功这个是最常见的逻辑。
  2. PROPAGATION_REQUIRED_NEW,场景:业务A方法调用B方法。A已经是REQUIRED事务,B采用PROPAGATION_REQUIRED_NEW,分为两种情况考虑,第一种:A成败对B有没有影响,答案需要细说,A方法发生异常引起回滚操作在调用B之前肯定会导致B不能调用,A发生异常在B方法之后对B无影响。第二种:B的成败对A有没有影响。答案需要细说,B方法发生异常引起回滚操作A对异常进行了捕获处理,这种情况不会影响A。B方法发生异常引起回滚操作A没有对异常进行了捕获处理,A的操作也会回滚。
  3. PROPAGATION_NESTED,场景:业务A方法调用B方法。A已经是REQUIRED事务,B采用PROPAGATION_NESTED,分为两种情况考虑,同PROPAGATION_REQUIRED_NEW情况。特殊说明,当B方法事务提交完成时是把B方法之前包括A的操作进行提交。当B回滚时只是B自己回滚不会影响到A的操作。