Unsafe:先查库存,再扣库存
多个请求同时读到同一个旧库存,各自认为可以下单,最后写回时互相覆盖。
当前阶段:等待播放
点击播放后,请关注多个请求是否读到了同一个旧库存。
实现路径
select stock
if stock > 0:
sleep(放大竞态窗口)
update stock = oldStock - 1
insert order
库存5
订单0
超卖0
并发窗口:请求重叠执行
用户请求
业务服务
数据库
ServiceselectById
sleep
updateById
sleep
updateById
DBstock=5
orders=0
orders=0
无原子条件
读旧库存后继续写入
读旧库存后继续写入
写入订单0 条
本应拒绝0 条超卖仍写入
多个请求读到 stock=5