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