还拿经典的下单逻辑来说。
我的整个逻辑可能是这样的:
- update goods set stock=$n where id = $ID and stock=$old_stock 更新库存
- update coupons set used = 1, order_id = $n where id = $ID and used = 0 and order id is null
- update credits set credits = $n where id = $ID and credits = $old_credits
假设,如果第一个 sql 成功,第二个 sql 成功(重试 5 次,间隔 1 秒),第三个失败了。然后 mysql 崩了(无论因为网络啊、进程啊、硬盘满了啊各种概率因素)导致后续的 sql 都不可能执行成功,而且崩了至少有一小时。
怎么保证在 1 小时后,刚下的订单为失败?或者让后续逻辑能继续执行?