数据隔离级别查询一致导致重复退款
@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)!