自学内容网 自学内容网

数据隔离级别查询一致导致重复退款

@Transactional
public void updateAfsState() {

String no = "500001880002";
OrderReturn orderReturnDb = orderReturnModel.getOrderReturnByAfsSn(no);
log.info("1.该售后单状态:{}" , orderReturnDb.getState());
if(orderReturnDb.getState().equals(OrdersAfsConst.RETURN_STATE_300)){
log.error("怡亚通:完成售后时,该售后单已经是完成状态了:{}" , no);
return;
}

//更新退货表
OrderReturn updateReturn = new OrderReturn();
updateReturn.setReturnId(orderReturnDb.getReturnId());
updateReturn.setState(OrdersAfsConst.RETURN_STATE_300);
updateReturn.setCompleteTime(new Date());
int update = orderReturnWriteMapper.updateByPrimaryKeySelective(updateReturn);

OrderReturn orderReturnDb2 = orderReturnModel.getOrderReturnByAfsSn(no);
log.info("2.该售后单状态:{}" , orderReturnDb2.getState());

log.info("===========");

}

第一次查询打印状态 200

然后更新数据,没有使用来的的对象

第二次查询打印状态也是 200

虽然没有查询Mybatis一级缓存,但是因为MySql 默认的数据隔离级别是可重复读,更新语句还没提交,所以查询出来依然状态 还是200。

解决方法:

1.加上分布式锁,在第一次查询数据前加锁。

2.在另一个类进行更新,

@Transactional 设置 PROPAGATION_REQUIRES_NEW .

有兴趣的同学可以试试。

 


原文地址:https://blog.csdn.net/DS_Watson/article/details/140570297

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!