2.21.1 Propagation.REQUIRES_NEW

在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务
// @Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();stuService.saveChildren();}}
在 StuServiceImpl 类中的 saveChildren 方法上添加事务
@Transactional(propagation = Propagation.REQUIRES_NEW)@Overridepublic void saveChildren() {saveChild1();int a = 1 / 0;saveChild2();}
清空数据,执行测试方法,发现数据库中有一条记录
在 TestTransServiceImpl 类中的 testPropagationTrans 方法启用事务
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();stuService.saveChildren();}
清空数据,执行测试方法,发现数据库没有记录
在 StuServiceImpl 类中的 saveChildren 方法中删除产生异常的语句
@Transactional(propagation = Propagation.REQUIRES_NEW)@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;}
清空数据,执行测试方法,发现数据库中插入两条记录,saveParent 方法回滚,saveChildren 方法执行成功
在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void saveChildren() {saveChild1();// int a = 1 / 0;saveChild2();}
清空数据,执行测试方法,发现数据库中没有记录
【总结】
Propagation.REQUIRES_NEW:如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;如果当前没有事务,则同 REQUIRED。
举例:领导有饭吃,我偏不要,我自己买了自己吃。
2.21.2 Propagation.NOT_SUPPORTED

在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务并删除产生异常的语句
// @Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();stuService.saveChildren();// int a = 1 / 0;}
在 StuServiceImpl 类中的 saveChildren 方法上添加事务
@Transactional(propagation = Propagation.NOT_SUPPORTED)@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;}
清空数据,执行测试方法,发现数据库中插入一条记录,saveParent 方法回滚,saveChildren 方法执行成功
【总结】
Propagation.NOT_SUPPORTED:如果当前有事务,则把事务挂起,自己不适用事务去运行数据库操作。
举例:领导有饭吃,分一点给你,我太忙了,放一边,我不吃。
2.21.3 Propagation.NEVER

在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性
@Transactional(propagation = Propagation.NEVER)@Overridepublic void saveChildren() {saveChild1();int a = 1 / 0;saveChild2();}
清空数据,执行测试方法,提示出错,非法的事务状态,标记的事务传播是 never
在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务
// @Transactional(propagation = Propagation.REQUIRED)@Overridepublic void testPropagationTrans() {stuService.saveParent();stuService.saveChildren();// int a = 1 / 0;}
清空数据,执行测试方法,提示出错
发现数据库中插入两条记录
【总结】
Propagation.NEVER:如果当前有事务存在,则抛出异常。
举例:领导有饭给你吃,我不想吃,我热爱工作,我抛出异常。
