事务传播行为

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:外层有事务,内层无事务。

外层调用内层的方法。内层也会加上事务。

 

上一篇:IService


下一篇:Spring前置通知