一次事务引发的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,所以事务回滚,插入的数据也被回滚了。
解决方法:
将查业务数据这部分数据剔除出去,事务中只应该存在关联的逻辑(要么都成功,要么都回滚)。