InnoDB 并发控制 = MVCC + 两阶段锁
课上讲并发控制有几条路线:两阶段锁(悲观,等锁)、时间戳和 OCC(乐观,冲突就回滚)、MVCC(多版本,读写不互堵)。InnoDB 是混着用的:
- 普通 SELECT:走 MVCC,读快照,不加锁。
- UPDATE、DELETE、FOR UPDATE、FOR SHARE:走两阶段锁,读最新版本并加锁,锁一直留到 COMMIT 或 ROLLBACK 才放,也就是强严格两阶段锁。
正因为普通读不加锁,RR 也不是可串行化,挡不住写偏斜。SERIALIZABLE 把普通 SELECT 也变成 FOR SHARE,才全部走两阶段锁。
几个不守两阶段锁的例外:RC 下 WHERE 不匹配的行判断完就提前放锁;自增锁语句结束就放。