幂等性问题:用户多次点击导致重复扣款

业务场景:物流系统中,用户在后台点击发货(调整货物重量,重新计价),这时候会进行修改订单状态,并且扣款或退款。

bug:但是这时候,用户同一时间点了多次发货,导致重复扣款。

思考:

首先,更新订单状态的时候加个条件判断,这样就不会重复更新订单了。

update set order_status where order_status = 0

其次,根据更新订单状态返回的结果来进行扣款退款操作。也就是说,更新条数为1,则执行退扣款操作,更新条数为0则不进行退扣款操作。

最后,必须保证同一时间下,只能有一个线程修改订单。

解决方法:

方法一:修改订单时加行级锁

update set order_status where order_status = 0 for update;

但是这个时候报了个错:大致意思是等待锁超时。造成的原因是,后台有个定时任务,该定时任务在修改订单加锁的同时,恰好也要操作该行记录,所以报错了。

因此,加锁是不太好的,于是;

 

方法二:

用事务+条件判断的方式来解决,大致如下,注意看两个事务更新成功条数的返回结果

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值