数据库中的 Lock(锁)死锁 本质上是因为 多个事务相互等待对方持有的锁,形成一个闭环,导致谁都无法继续执行。下面从原理、常见原因和示例三个层面说明。
在数据库中:
此时:
双方都不会主动退让 → 死锁(Deadlock)
数据库通常会:
事务A:先锁 表1,再锁 表2
事务B:先锁 表2,再锁 表1
并发时极易形成环。
✅ 解决:统一加锁顺序
-- 事务A
UPDATE account SET balance=... WHERE id=1;
UPDATE account SET balance=... WHERE id=2;
-- 事务B
UPDATE account SET balance=... WHERE id=2;
UPDATE account SET balance=... WHERE id=1;
行锁也可能死锁。
例如:
在 SQL Server、Oracle 中较常见。
如:
SELECT ... FOR UPDATE事务越长:
-- 事务A
BEGIN;
UPDATE users SET name='A' WHERE id=1;
-- 事务B
BEGIN;
UPDATE users SET name='B' WHERE id=2;
-- 事务A
UPDATE users SET name='A' WHERE id=2; -- 等待B
-- 事务B
UPDATE users SET name='B' WHERE id=1; -- 等待A
结果:死锁
✅ 最佳实践:
数据库 Lock 死锁,是因为多个事务“互相等对方的锁”,形成无法打破的等待环。
如果你愿意,我可以:
你可以直接贴场景。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。