数据库 2PL v/s MVCC

查看原文

解决幻读 (Phantom Read) 的方法有两种:2PL 与 MVCC。

幻读 = 范围查询出现了别的事务的数据。

2PL (Two-Phase Locking) 是传统做法,通过 shared(read) 和 exclusive(write) lock 序列化事务调度。例如 MySQL(InnoDB),在底层它为每行或一段行获取 shared physical lock 。它使用的技术叫 next-key locking. 假设事务在 MySQL 中使用 Serializable isolation level,事务B 中的插入会因为事务A获得了锁,导致事务B等待(超时后回滚)

MVCC 的假设是 Readers 和 Writers 互相不应该堵塞,所以它的方法是乐观的:冲突就让它发生,提交时来判定是否允许。尽管 MVCC 锁比 2PL 用的少了,但依然会用到:每次修改记录的时候,exclusive locks 依然会去申请。

SQL Server 中 MVCC 的隔离级别有两种:Read Committed Snapshot Isolation 和 Snapshot Isolation。区别点在于获取快照的时间点:前者在 query 开始是,后者在事务开始时。