1:外层方法无事务,内层方法有事务
外层方法:
1 @Override 2 public void transactionTo() { 3 PmsProductAttributeCategory pmsProductAttributeCategory = baseMapper.selectById(1L); 4 pmsProductAttributeCategory.setPcUpdateTime(LocalDateTime.now()); 5 baseMapper.updateById(pmsProductAttributeCategory); 6 //去调用去调用PmsProductService类的 testTransaction()方法,带有事务 7 pmsProductService.testTransaction(); 8 }
内层方法:
@Override @Transactional(propagation = Propagation.NESTED) public void testTransaction() { log.info("测试事务。修改id=1的值"); PmsProduct pmsProduct = baseMapper.selectById(1L); pmsProduct.setProUpdateTime(LocalDateTime.now()); baseMapper.updateById(pmsProduct); int j = 1/0; }
无论Propagation 是哪种传播行为,都是外层方法没有事务行为。内层方法有事务行为。Propagation 默认的是:REQUIRED
2:外层和内层都是REQUIRED事务
如果多个方法都声明了 REQUIRED,并且他们嵌套调用,那么他们会共享同一个物理事务。就是 inner 产生了回滚,那么 outer 会跟着回滚。
外层:
1 @Override 2 @Transactional(propagation = Propagation.REQUIRED) 3 public void transactionTo() { 4 PmsProductAttributeCategory pmsProductAttributeCategory = baseMapper.selectById(1L); 5 pmsProductAttributeCategory.setPcUpdateTime(LocalDateTime.now()); 6 baseMapper.updateById(pmsProductAttributeCategory); 7 //去调用去调用PmsProductService类的 testTransaction()方法,带有事务 8 pmsProductService.testTransaction(); 9 }
内层:
1 @Override 2 @Transactional(propagation = Propagation.REQUIRED) 3 public void testTransaction() { 4 log.info("测试事务。修改id=1的值"); 5 PmsProduct pmsProduct = baseMapper.selectById(1L); 6 pmsProduct.setProUpdateTime(LocalDateTime.now()); 7 baseMapper.updateById(pmsProduct); 8 int j = 1/0; 9 }
inner 的回滚不影响 outer 的事务。当 inner 事务开启后,outer 事务会暂停,当 inner 事务结束后,outer 事务恢复。
3:外层有事务,内层无事务。
外层调用内层的方法。内层也会加上事务。