数据库中的 Deadlock(死锁) 是指两个或多个事务在执行过程中,因互相持有对方所需的锁而陷入永久等待的状态。常见原因主要包括以下几类:
最常见原因。
如果事务 A 先锁表/行 X 再锁 Y,而事务 B 先锁 Y 再锁 X,就容易出现死锁。
事务A: lock(X) → lock(Y)
事务B: lock(Y) → lock(X)
✅ 解决思路:
事务中包含:
导致锁长时间不释放,增加死锁概率。
✅ 解决思路:
没有索引时:
✅ 解决思路:
WHERE 条件走全表扫描如:
多个事务同时修改同一行。
✅ 解决思路:
如:
SELECT ... FOR UPDATELOCK TABLE✅ 解决思路:
更新父表时,数据库可能自动锁子表相关行。
✅ 解决思路:
如:
可能导致锁行为不一致。
不同数据库死锁表现不同:
✅ 统一访问顺序
✅ 缩短事务
✅ 合理索引
✅ 降低锁粒度
✅ 使用死锁重试机制
如果你有具体数据库(MySQL / Oracle / PostgreSQL 等)或业务场景,我可以给更针对性的建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。