定序加锁示例
定序加锁示例
-- 反例:两个事务按不同顺序更新两张表
-- 正例:统一「先 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 做有限次退避重试 |
| 热点 | 单行热点用队列/分片化解 |
减少死锁的收益常大于「消灭」:允许偶发死锁 + 应用重试是成熟工程实践。