知识卡片

单SQL防超卖

专业/工作 · 490.d.1.a.2

内容

扣库存应尽量把检查和更新放进同一条带条件的 SQL,用数据库原子性避免“先查后改”的竞态窗口。乐观锁适合高并发读写冲突,但失败重试和提示也要设计清楚。另一条防超卖思路是应用层的 [[本地扣库存削峰]]。

参考来源

- 位置:《Go语言高级开发与实战》第6章《Go语言秒杀系统实战》(源文件:_epub-src/GoYu Yan Gao Ji Kai Fa Yu Shi Zhan_split_054.html) - 结论依据:原文指出传统先查库存再 UPDATE 需要两条 SQL,而一条 SQL 可保证不超卖,并提到版本号乐观锁性能较好,因此支撑该结论。 - 原始内容:的商品一旦超过了库存就不能再卖了。 1 防止超卖的方法 1)精简SQL。典型的一个场景是,在进行扣减库存的时候,传统的做法是先查询库存,再去执行UPDATE语句。这样的话需要两个SQL语句,而实际上一个SQL语句就可以完成的,代码如下。 这样的话,就可以保证库存不会超卖并且一次更新库存即可。还要注意的一点是这里使用了版本号的乐观锁,相比悲观锁,它的性能较好。 提示 :悲观锁(Pessimis