背景描述:
在支付,退款回调的方法中添加Transactional ,来保证订单状态和业务状态一致
问题出现:
在一个支付回调中,处理第三方预约,如果第三方预约失败,则调用微信退款接口;然而第三方因为网络原因,处理时间超过30s;
这时候发现微信的回调会在30s内触发2次,第一次触发和第二次触发,因为有事务的隔离,所以2次方法是完全一样的,在第一次事务正确结束后,第二次事务又将正确结果修改为异常数据;
解决方法:
在支付成功失败后执行的sql上添加for update, 实现行级锁,即当update执行时,该条数据无法查询,待修改完成后,才会继续向下执行;
网友评论