系列四十六、Spring的事务传播行为案例演示(六)#SUPPORTS

一、演示Spring的传播行为(SUPPORTS)

1.1、StockServiceImplSUPPORTS 

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/30 15:43
 * @Description: 演示SUPPORTS的传播行为
 *      外部不存在事务:不开启新的事务
 *      外部存在事务:融合到外部事务中
 */
@Service(value = "stockServiceImplSUPPORTS")
public class StockServiceImplSUPPORTS extends ServiceImpl implements StockService {

    @Resource
    private StockMapper stockMapper;

    @Resource
    private IntegralService integralServiceImplSUPPORTS;

    /**
     * SUPPORTS的传播行为
     * @param id
     * @param num
     * 场景一:外部不存在事务(注释掉reduceStock的@Transactional注解),内部存在事务(传播属性为SUPPORTS)
     *      预期结果:外部普通方法 & 内部事务方法都正常提交
     *      实际结果:外部普通方法 & 内部事务方法都正常提交
     *      对应方法:m1()
     *
     * 场景二:外部存在事务(REQUIRED),内部存在事务(MANDATORY)
     *      预期结果:外部事务 & 内部事务都回滚
     *      实际结果:外部事务 & 内部事务都回滚
     *      对应方法:m1()
     * ...
     */
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    @Override
    public void reduceStock(Long id, Integer num) {
        m1(id, num);
    }

    private void m1(Long id, Integer num) {
        System.out.println("==============>StockServiceImplSUPPORTS的m1()执行了");
        try {
            // 减库存
            StockDO dbStock = stockMapper.selectById(id);
            StockDO updateStock = new StockDO();
            BeanUtils.copyProperties(dbStock, updateStock);
            updateStock.setNum(dbStock.getNum() - num);
            stockMapper.updateById(updateStock);

            // 增加积分
            IntegralDO updateIntegral = new IntegralDO();
            updateIntegral.setPreIntegral(0);
            updateIntegral.setCurrentIntegral(1000);
            updateIntegral.setUserId(1L);
            integralServiceImplSUPPORTS.addIntegral(updateIntegral);

            int i = 10 / 0;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


}

1.2、IntegralServiceImplSUPPORTS 

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/30 15:43
 * @Description: 演示NESTED的传播行为
 *      外部不存在事务:
 *      外部存在事务:
 */
@Service(value = "integralServiceImplSUPPORTS")
public class IntegralServiceImplSUPPORTS extends ServiceImpl implements IntegralService {

    @Resource
    private IntegralMapper integralMapper;

    @Transactional(propagation = Propagation.SUPPORTS,rollbackFor = Exception.class)
    @Override
    public void addIntegral(IntegralDO updateIntegral) {
        m1(updateIntegral);
    }

    private void m1(IntegralDO updateIntegral) {
        try {
            System.out.println("==============>IntegralServiceImplSUPPORTS的m1()执行了");
            integralMapper.insert(updateIntegral);
            int i = 10 / 0;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

你可能感兴趣的:(Spring全家桶面试系列,spring,java,后端)