数据库死锁(Deadlock)是指两个或多个事务相互持有对方所需的锁,并互相等待对方释放,从而导致所有相关事务都无法继续执行的情况。
死锁无法 100% 彻底杜绝(尤其在高并发下),但可以通过设计、开发和运维手段大幅避免和减少。
下面从 设计原则、开发规范、数据库配置、运维监控 四个层面系统说明。
所有事务都按相同顺序访问表和行。
❌ 容易死锁:
✅ 避免方式:
这是避免死锁最有效、最常用的方法。
✅ 原则:事务只做数据库操作,尽快提交
SELECT * FROM table;
UPDATE table SET ...;
无索引的更新会导致锁全表✅ 确保:
典型高危场景:
✅ 推荐:
SELECT ... FOR UPDATE(明确加锁)UPDATE account
SET balance = balance - 100, version = version + 1
WHERE id = 1 AND version = 2;
| 隔离级别 | 死锁概率 | 说明 |
|---|---|---|
| READ UNCOMMITTED | 低 | 很少用 |
| READ COMMITTED | 中 | 推荐(Oracle 默认) |
| REPEATABLE READ | 高 | MySQL 默认,易锁等待 |
| SERIALIZABLE | 最高 | 性能差 |
✅ 多数系统:READ COMMITTED + 行锁
innodb_deadlock_detect = ON
innodb_lock_wait_timeout = 5
SHOW ENGINE INNODB STATUS;
Deadlock found when trying to get lock
死锁是可恢复错误:
捕获 Deadlock 异常 → 短暂退避 → 重试事务
✅ 通常重试 2–3 次即可
如果你愿意,可以告诉我:
我可以给你针对性的死锁避免方案或 SQL 示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。