2.21.1 Propagation.REQUIRES_NEW

image.png
在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务

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

在 StuServiceImpl 类中的 saveChildren 方法上添加事务

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

清空数据,执行测试方法,发现数据库中有一条记录
image.png
在 TestTransServiceImpl 类中的 testPropagationTrans 方法启用事务

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

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

  1. @Transactional(propagation = Propagation.REQUIRES_NEW)
  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. }

清空数据,执行测试方法,发现数据库中插入两条记录,saveParent 方法回滚,saveChildren 方法执行成功
image.png
在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性

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

清空数据,执行测试方法,发现数据库中没有记录
image.png
【总结】
Propagation.REQUIRES_NEW:如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;如果当前没有事务,则同 REQUIRED。
举例:领导有饭吃,我偏不要,我自己买了自己吃。

2.21.2 Propagation.NOT_SUPPORTED

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.NOT_SUPPORTED)
  2. @Override
  3. public void saveChildren() {
  4. saveChild1();
  5. int a = 1 / 0;
  6. saveChild2();
  7. }

清空数据,执行测试方法,发现数据库中插入两条记录
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. }

清空数据,执行测试方法,发现数据库中插入一条记录,saveParent 方法回滚,saveChildren 方法执行成功
image.png
【总结】
Propagation.NOT_SUPPORTED:如果当前有事务,则把事务挂起,自己不适用事务去运行数据库操作。
举例:领导有饭吃,分一点给你,我太忙了,放一边,我不吃。

2.21.3 Propagation.NEVER

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

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

清空数据,执行测试方法,提示出错,非法的事务状态,标记的事务传播是 never
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. }

清空数据,执行测试方法,提示出错
image.png
发现数据库中插入两条记录
image.png
【总结】
Propagation.NEVER:如果当前有事务存在,则抛出异常。
举例:领导有饭给你吃,我不想吃,我热爱工作,我抛出异常。