2.21.3 Propagation.NESTED

在 TestTransServiceImpl 类中的 testPropagationTrans 方法启用事务
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();stuService.saveChildren();int a = 1 / 0;}
在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性
@Transactional(propagation = Propagation.NESTED)@Overridepublic void saveChildren() {saveChild1();// int a = 1 / 0;saveChild2();}
清空数据,执行测试方法,发现数据库中没有记录
在 StuServiceImpl 类中的 saveChildren 方法上开启异常语句
@Transactional(propagation = Propagation.NESTED)@Overridepublic void saveChildren() {saveChild1();int a = 1 / 0;saveChild2();}
在 TestTransServiceImpl 类中的 testPropagationTrans 方法删除异常语句
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();stuService.saveChildren();// int a = 1 / 0;}
清空数据,执行测试方法,发现数据库中没有记录
修改 TestTransServiceImpl 类中的 testPropagationTrans 方法
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();try {// save pointstuService.saveChildren();} catch (Exception e) {e.printStackTrace();}// int a = 1 / 0;}
save point:保存点,主方法中其他的事务不会受到捕获的异常方法所影响。
清空数据,执行测试方法,发现数据库中插入了一条记录,saveParent 方法执行成功,saveChildren 方法回滚
【总结】
Propagation.NESTED:如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;如果当前没有事务,则同 REQUIRED。但是如果主事务提交,则会携带子事务一起提交。如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务可以回滚或不回滚。
举例:领导决策不对,老板怪罪,领导带着小弟一同受罪。小弟出了差错,领导可以推卸责任。
