MVCC(Mutil-Version Concurrency Control)
- 全称是多版本并发控制
- 目的在于提高数据库高并发场景下的吞吐性能
为什么需要MVCC
并发事务处理代理啊一些问题:
- 更新丢失
- 脏读
- 不可重复读
- 幻读
后三者需要数据库提供事务间的隔离机制来解决
方法:
- 加读写锁
- 一致性快照读,即MVCC
基本特征
- 每行数据都存在一个版本,每次数据更新时都更新该版本。
- 修改时Copy出当前版本随意修改,各个事务之间无干扰。
- 保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
ReadView
- 已提交读-每次查询的开始都会生成一个独立的ReadView
- 可重复读- 在第一次读的时候生成一个ReadView,之后的读都复用之前的ReadView
关于Mysql中MVCC的总结
客观上,我们认为他就是乐观锁的一整实现方式,就是每行都有版本号,保存时根据版本号决定是否成功。但由于Mysql的写操作会加排他锁,如果锁定了还算不算是MVCC?了解乐观锁的小伙伴们,都知道其主要依靠版本控制,即消除锁定,二者相互矛盾,so从某种意义上来说,Mysql的MVCC并非真正的MVCC,他只是借用MVCC的名号实现了读的非阻塞而已。