业务场景:物流系统中,用户在后台点击发货(调整货物重量,重新计价),这时候会进行修改订单状态,并且扣款或退款。
bug:但是这时候,用户同一时间点了多次发货,导致重复扣款。
思考:
首先,更新订单状态的时候加个条件判断,这样就不会重复更新订单了。
update set order_status where order_status = 0
其次,根据更新订单状态返回的结果来进行扣款退款操作。也就是说,更新条数为1,则执行退扣款操作,更新条数为0则不进行退扣款操作。
最后,必须保证同一时间下,只能有一个线程修改订单。
解决方法:
方法一:修改订单时加行级锁
update set order_status where order_status = 0 for update;
但是这个时候报了个错:大致意思是等待锁超时。造成的原因是,后台有个定时任务,该定时任务在修改订单加锁的同时,恰好也要操作该行记录,所以报错了。
因此,加锁是不太好的,于是;
方法二:
用事务+条件判断的方式来解决,大致如下,注意看两个事务更新成功条数的返回结果