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

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

1.1、StockServiceImplMANDATORY 

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/30 15:43
 * @Description: 演示MANDAORY的传播行为
 *      外部不存在事务:抛出异常 No existing transaction found for transaction marked with propagation 'mandatory'
 *      外部存在事务:融合到外部的事务
 *      要求外部方法必须有事务
 */
@Service(value = "stockServiceImplMANDATORY")
public class StockServiceImplMANDATORY extends ServiceImpl implements StockService {

    @Resource
    private StockMapper stockMapper;

    @Resource
    private IntegralService integralServiceImplMANDATORY;

    /**
     * MANDAORY的传播行为
     * @param id
     * @param num
     * 场景一:外部不存在事务(注释掉reduceStock的@Transactional注解),内部存在事务(传播属性为MANDATORY)
     *      预期结果:抛异常
     *      实际结果:外部普通方法正常执行,内部事务方法回滚
     *      对应方法: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("==============>StockServiceImplMANDATORY的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);
            integralServiceImplMANDATORY.addIntegral(updateIntegral);

            int i = 10 / 0;

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


}

1.2、IntegralServiceImplMANDATORY 

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

    @Resource
    private IntegralMapper integralMapper;

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

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

}

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