首页/数据/数据库速查/死锁预防的工程手段
本包目录(495 条)
MySQL 基础与连接36 条SQL 语法52 条用户与权限21 条备份与恢复56 条主从复制与高可用53 条
性能与调优57 条
Redis 命令96 条Redis 运维与场景124 条

死锁预防的工程手段

预防死锁四招:按固定顺序访问表/行、事务短小、更新前先 SELECT ... FOR UPDATE 定序、热点行拆散(如账户余额分桶)。

数据库速查数据更新于 2026-10-12

定序加锁示例

定序加锁示例
-- 反例:两个事务按不同顺序更新两张表
-- 正例:统一「先 A 后 B」
BEGIN;
SELECT * FROM appdb.accounts WHERE id = 1 FOR UPDATE;
SELECT * FROM appdb.accounts WHERE id = 2 FOR UPDATE;
UPDATE appdb.accounts SET balance = balance - 100 WHERE id = 1;
UPDATE appdb.accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
要点ID 排序成对加锁;大事务拆分
重试应用捕获 1213 做有限次退避重试
热点单行热点用队列/分片化解
减少死锁的收益常大于「消灭」:允许偶发死锁 + 应用重试是成熟工程实践。

易错点

  • 重试不设上限/无退避:死锁风暴下重试放大打爆数据库
  • 把业务锁与数据库锁混用设计:两层锁顺序全乱,排查地狱

数据来源与参考

  • MySQL 8.0 Reference Manual: Deadlocks

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌