在 OLTP(在线事务处理)系统中,高并发、短事务是典型特征,锁冲突会直接导致吞吐下降、响应变慢甚至死锁。降低锁冲突通常从设计、SQL、索引、隔离级别、架构几个层面入手。
✅ 好:
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
COMMIT;
❌ 差:
BEGIN;
SELECT ...;
-- sleep / 调用外部系统
UPDATE ...;
COMMIT;
❌:
UPDATE orders SET status = 'DONE';
✅:
UPDATE orders SET status = 'DONE'
WHERE id = 12345;
多个事务更新多张表或多行时:
✅ 固定顺序:
总是先更新 A,再更新 B
❌ 随机顺序:
事务1:A → B
事务2:B → A
UPDATE 就不要用 SELECT … FOR UPDATE + UPDATE无索引会导致:
✅ 确保:
WHERE id = ?
WHERE user_id = ? AND status = ?
有合适索引
典型问题:
解决方案:
但注意:
SELECT 不加锁SELECT ... FOR UPDATELOCK IN SHARE MODE❌ 直接 UPDATE 单行 ✅ 方案:
❌ 每行都 UPDATE ✅:
降低 OLTP 锁冲突的核心:少锁、短锁、小锁、错开锁。
如果你有具体数据库(MySQL / PostgreSQL / Oracle)或使用场景(电商、金融、订单),我可以给更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。