@Transactional 学习笔记 - spring事务初级用法

@Transactional 学习笔记 - spring事务初级用法

业务场景: 同时操作两张表

业务要求同时操作两张表,要么同时成功,要么同时失败

准备工作: 准备两张表

准备两张表

情景1: 同一个方法里,依次插入张表
/**
     * 一个方法里插入两张表数据
     *
     * @return
     */

    @Override
    @Transactional
    public Boolean insertTogether() {

        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);

        TransactionalTwo transactionalTwo = new TransactionalTwo();
        transactionalTwo.setName("markeloff");
        transactionalTwoMapper.insert(transactionalTwo);

        return Boolean.TRUE;
    }

结果:无异常,都插入成功

情景2: 同一个方法里,依次插入两张表,任意地方发生异常
 @Override
    @Transactional
    public Boolean insertTogether() {

        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);

        if(true){
            log.info("--------------------------------------");
            throw new BusinessException(951022,"主动抛出业务异常");
        }

        TransactionalTwo transactionalTwo = new TransactionalTwo();
        transactionalTwo.setName("markeloff");
        transactionalTwoMapper.insert(transactionalTwo);

        return Boolean.TRUE;
    }
结果:发生异常,都两张表都插入失败

情景3: 方法一插入表1,调用方法二插入表2
@Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertOneAndOne() {
        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);

        insertTransactionalTwo();

        return Boolean.TRUE;
    }

    public void insertTransactionalTwo() {

            TransactionalTwo transactionalTwo = new TransactionalTwo();
            transactionalTwo.setName("markeloff");
            transactionalTwoMapper.insert(transactionalTwo);
    }
结果:无异常,都插入成功

情景4: 方法一插入表1,方法二插入表2 ,两个方法任意地方发生异常
@Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertOneAndOne() {
        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);

        insertTransactionalTwo();

        if(true){
            log.info("--------------------------------------");
            throw new BusinessException(951022,"主动抛出业务异常");
        }

        return Boolean.TRUE;
    }

    public void insertTransactionalTwo() {

            TransactionalTwo transactionalTwo = new TransactionalTwo();
            transactionalTwo.setName("markeloff");
            transactionalTwoMapper.insert(transactionalTwo);
    }
结果:发生异常, 两张表都插入失败

情景5: 方法一插入表1,方法一try调用方法二,方法二插入表2 ,try之前发生异常
@Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertOneAndOne() {
        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);
        if (true) {
            log.info("--------------------------------------");
            throw new BusinessException(951022, "主动抛出业务异常");
        }
        try {
            insertTransactionalTwo();
        } catch (Exception e) {

            e.printStackTrace();
        }
        return Boolean.TRUE;
    }

    public void insertTransactionalTwo() {

        TransactionalTwo transactionalTwo = new TransactionalTwo();
        transactionalTwo.setName("markeloff");
        transactionalTwoMapper.insert(transactionalTwo);
    }
结果:发生异常, 两张表都插入失败 。 异常发生在try语句之前,未被捕获,直接回滚

情景6: 方法一插入表1,方法一try调用方法二,方法二插入表2 ,try之后发生异常
@Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertOneAndOne() {
        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);

        try {
            insertTransactionalTwo();
        } catch (Exception e) {

            e.printStackTrace();
        }
        return Boolean.TRUE;
    }

    public void insertTransactionalTwo() {

        if (true) {
            log.info("--------------------------------------");
            throw new BusinessException(951022, "主动抛出业务异常");
        }

        TransactionalTwo transactionalTwo = new TransactionalTwo();
        transactionalTwo.setName("markeloff");
        transactionalTwoMapper.insert(transactionalTwo);
    }
结果:捕获异常, 表1插入成功 。 表2插入失败,因为表2的insert之前已经发生异常 , 但是异常被捕获, 并未回滚。如果异常发生在表2 insert后,则表2也能插入成功。

情景7: 方法一插入表1,方法一try调用方法二,方法二插入表2 ,try之后发生异常
@Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean insertOneAndOne() {
        TransactionalOne transactionalOne = new TransactionalOne();
        transactionalOne.setName("markeloff");
        transactionalOneMapper.insert(transactionalOne);

        try {
            insertTransactionalTwo();
        }finally {
            
        }
        return Boolean.TRUE;
    }

    public void insertTransactionalTwo() {

        if (true) {
            log.info("--------------------------------------");
            throw new BusinessException(951022, "主动抛出业务异常");
        }

        TransactionalTwo transactionalTwo = new TransactionalTwo();
        transactionalTwo.setName("markeloff");
        transactionalTwoMapper.insert(transactionalTwo);
    }
结果:发生异常,两张表都插入失败,原因是抛出的异常并没有catch语句捕获,直接回滚。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值