MVCC(多版本并发控制,Multi-Version Concurrency Control)之所以能降低死锁概率,核心原因在于:它让“读”不阻塞“写”、“写”也不阻塞“读”,从而减少事务之间因互相等待锁而产生的循环依赖。
下面从原理到机制具体说明。
死锁通常满足四个条件:
在数据库里,死锁最常见于:
→ 互相阻塞,形成循环等待。
在 MVCC 中:
SELECT(普通读)读取的是历史快照版本✅ 效果:
➡ 大量读事务不会参与锁等待,自然降低死锁概率。
MVCC 中:
对比:
➡ 锁的持有时间更短,冲突窗口更小。
在一些数据库中:
➡ 锁粒度更细、锁更少,死锁更难形成。
MVCC 通过:
让不同事务看到不同版本数据。
✅ 即使数据在并发修改:
➡ 减少了“为了一致性而互相等待”的场景。
需要注意:
SELECT ... FOR UPDATE 等当前读仍会加锁示例仍可能死锁:
-- 事务 A
UPDATE account SET money=money-1 WHERE id=1;
UPDATE account SET money=money+1 WHERE id=2;
-- 事务 B
UPDATE account SET money=money-1 WHERE id=2;
UPDATE account SET money=money+1 WHERE id=1;
➡ MVCC 降低概率,但不消除死锁。
MVCC 通过“读不加锁、读写不互斥、缩短锁持有时间”,显著减少了事务间因锁等待形成的循环依赖,从而降低死锁概率。
如果你愿意,我也可以结合 MySQL InnoDB / PostgreSQL 的具体实现来对比说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。