2.21.3 Propagation.NESTED

image.png
在 TestTransServiceImpl 类中的 testPropagationTrans 方法启用事务

  1. @Transactional(propagation = Propagation.REQUIRED)
  2. @Override
  3. public void testPropagationTrans() {
  4. stuService.saveParent();
  5. stuService.saveChildren();
  6. int a = 1 / 0;
  7. }

在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性

  1. @Transactional(propagation = Propagation.NESTED)
  2. @Override
  3. public void saveChildren() {
  4. saveChild1();
  5. // int a = 1 / 0;
  6. saveChild2();
  7. }

清空数据,执行测试方法,发现数据库中没有记录
image.png
在 StuServiceImpl 类中的 saveChildren 方法上开启异常语句

  1. @Transactional(propagation = Propagation.NESTED)
  2. @Override
  3. public void saveChildren() {
  4. saveChild1();
  5. int a = 1 / 0;
  6. saveChild2();
  7. }

在 TestTransServiceImpl 类中的 testPropagationTrans 方法删除异常语句

  1. @Transactional(propagation = Propagation.REQUIRED)
  2. @Override
  3. public void testPropagationTrans() {
  4. stuService.saveParent();
  5. stuService.saveChildren();
  6. // int a = 1 / 0;
  7. }

清空数据,执行测试方法,发现数据库中没有记录
image.png
修改 TestTransServiceImpl 类中的 testPropagationTrans 方法

  1. @Transactional(propagation = Propagation.REQUIRED)
  2. @Override
  3. public void testPropagationTrans() {
  4. stuService.saveParent();
  5. try {
  6. // save point
  7. stuService.saveChildren();
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
  11. // int a = 1 / 0;
  12. }

save point:保存点,主方法中其他的事务不会受到捕获的异常方法所影响。
清空数据,执行测试方法,发现数据库中插入了一条记录,saveParent 方法执行成功,saveChildren 方法回滚
image.png
【总结】
Propagation.NESTED:如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;如果当前没有事务,则同 REQUIRED。但是如果主事务提交,则会携带子事务一起提交。如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务可以回滚或不回滚。
举例:领导决策不对,老板怪罪,领导带着小弟一同受罪。小弟出了差错,领导可以推卸责任。