并发竞态条件怎么排查提示词(超卖、重复扣款、余额对不上、读写交错)
出现库存超卖、优惠券被领多次、余额对不上、计数偏少这类「单个请求没问题、并发时出错」的情况时用:让 AI 找出「先读后写」的竞态窗口,画出两个请求交错的时序,给出数据库层或代码层的正确修复。
通用大模型 对话模型通用
你是一名精通并发与数据库事务的后端工程师。下面的代码在并发场景下出现了数据错误,请找出竞态条件并修复。 信息: - 语言、框架、数据库:[语言、框架、数据库](例:Python + Django + MySQL 8) - 部署方式:[单实例/多实例/多进程] - 出错现象:[如库存变成负数、同一张券被领两次] - 数据库隔离级别(不知道就写默认):[隔离级别] - 相关代码(包括事务边界): [粘贴代码] 请按以下步骤分析: 1. 标出所有「读取 → 判断 → 写入」的位置,这是竞态最常出现的地方。 2. 用时序表演示两个并发请求如何交错导致错误:时刻 | 请求 A | 请求 B | 数据库中的值。 3. 说明现有的保护为什么不够,例如:事务只能保证原子提交,不能阻止两个事务读到同一个旧值;进程内的锁在多实例部署下无效;当前隔离级别下会发生什么。 4. 给出修复方案,按推荐程度排序,每种写清适用条件和代价: - 条件更新:把判断放进写语句里,检查受影响行数; - 悲观锁:SELECT ... FOR UPDATE,注意锁的范围和死锁; - 乐观锁:版本号字段 + 冲突重试; - 唯一约束:用数据库约束兜底防重复; - 分布式锁:只在前面几种都不适用时使用,说明过期时间和释放时的注意事项。 5. 写出推荐方案的完整代码。 6. 写一个能复现问题的并发测试(例如同时发起 50 个请求),修复前应失败,修复后应通过。 如果信息不足以判断(比如不清楚是否多实例部署),先指出需要确认什么。
高亮处换成你自己的内容:[语言、框架、数据库]、[单实例/多实例/多进程]、[如库存变成负数、同一张券被领两次]、[隔离级别]、[粘贴代码]
ChatGPT Plus 充值
已被复制 0 次
使用说明
怎么填变量:[部署方式] 一定要写,很多人用语言自带的锁(比如 Java 的 synchronized、Python 的 threading.Lock)解决了单机测试,上线多实例后照样出错。事务边界要贴清楚,代码里哪一段在事务内、哪一段在事务外直接影响结论。
常见坑:
- 「我已经加了事务」是最常见的误解。默认隔离级别下,两个事务完全可以读到同一个库存值,然后各自减 1。
- 能用一条带条件的 UPDATE 解决的,就不要上分布式锁。条件更新简单、可靠、没有锁过期的问题。
- 并发测试要真正并发:用线程池或异步同时发起请求,而不是循环里一个接一个地调用。
追问技巧:修复后追问「在这个方案下,如果数据库主从延迟、或者请求在提交前超时重试,还会出错吗」,把边界情况也问到。
示例输出
示例,仅供参考(库存超卖)
| 时刻 | 请求 A | 请求 B | 库存 |
|---|---|---|---|
| t1 | 读到库存 1 | 1 | |
| t2 | 读到库存 1 | 1 | |
| t3 | 判断大于 0,写入 0 | 0 | |
| t4 | 判断大于 0,写入 0(应拒绝) | 0,卖出 2 件 |
推荐修复:把判断放进 UPDATE,并检查受影响行数。
python
from django.db.models import F
updated = Product.objects.filter(id=pid, stock__gte=qty).update(stock=F("stock") - qty)
if updated == 0:
raise OutOfStock()同款作品
用这条提示词做出来的作品;原作者会因此获得积分
还没有同款,来做第一个。



0 条评论
还没有评论,来抢沙发~