欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一次事务引发的BUG

程序员文章站 2022-03-23 17:00:14
...

现象:

插入sql没问题,但是却出现了时而入库,时而不入库的情况。
原代码如下:

@Override
    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
    public void reduceAvailableAmountWithLock(OperationAvailableBalanceDto dto, FridsPayCommandOrder order) {
        LOGGER.info("reduceAvailableAmountWithLock,dto:{}", dto);
        //查业务数据
        this.getBusinessData(dto);
        //扣减公文号可用余额
        reduceAvailableBalanceServiceImpl.reduceBalanceAmount(dto);
        //付款单加事中锁
        reduceAvailableBalanceServiceImpl.addPayLock(dto);
        //操作日志
        reduceAvailableBalanceServiceImpl.insertOperationLog(dto);
        LOGGER.info("reduceAvailableAmountWithLock,end");
    }
this.getBusinessData(dto);里面包含了插入语句:
fridsFundBusinessDataMapper.insert(fundBusinessData);

原因:

扣减公文号可用余额这行代码,出现了Exception,所以事务回滚,插入的数据也被回滚了。

解决方法:

将查业务数据这部分数据剔除出去,事务中只应该存在关联的逻辑(要么都成功,要么都回滚)。