1. MVCC 与锁的关系,MVCC 减少锁、但仍需锁处理写写冲突?
MVCC 与锁是什么关系?为什么 MVCC 主要用于减少读写之间的阻塞,但写写冲突仍需要锁来处理?
- MVCC 解决读写阻塞、读不阻塞写的机制
- 写写冲突仍需加锁的原因
- 快照读与当前读的加锁差异
MVCC(Multi-Version Concurrency Control,多版本并发控制)通过为每个事务维护多个数据版本,让读操作(快照读)读取历史版本而不需要等待写事务提交,从而实现了"读不阻塞写、写不阻塞读"。但 MVCC 并没有消除写写冲突:两个事务同时修改同一行时,后写的一方必须等待先写的一方提交或回滚,这个等待就是通过加锁(行锁/当前读)实现的。因此 MVCC 与锁是互补关系,MVCC 负责降低读写竞争,锁负责保证写写操作之间的互斥与原子性。
MVCC 的核心价值在于把"读写冲突"从"必须互斥"变为"可并行",而写写冲突本质上无法通过版本化消除,因为一行只能有一个最终生效的新版本,必须用锁串行化。这也是为什么"MVCC 减少锁"而不等于"MVCC 不需要锁"。