什么是MVCC

多版本并发控制:读取数据时通过一种类似快照的方式将数据保存下来,这样读锁和写锁就不冲突了,不同的事务session会看到自己特定版本的数据,版本链。
MVCC只在读已提交和可重复读两个隔离级别下工作,因为读未提交总会读取最新的数据,可序化则是会对所有读取的行都加锁。

聚簇索引记录中有两个必要的隐藏列:
trx_id(事务id):用来存储每次对某条聚簇索引记录进行修改的时候的事务id。
roll_pointer(回滚指针):每次对那条聚簇索引记录有修改的时候,都会把老版本写入undo日志中,roll_pointer存储了上个版本的位置指针,可以通过它来获取到上一个版本的记录信息,不过插入是没有这个记录的。

读已提交和可重复读的区别在于它们生成ReadView的策略不同。

ReadView:开始事务时会创建ReadView,它是一个用来维护当前活动(未提交)的事务id的一个有序的数组(从小到大)。
事务需要访问数据时,先获取数据中最大的事务id,对比ReadView:
如果事务id要比ReadView里的小,在左边,说明该事务已被提交了,就可以访问。
如果事务id要比ReadView里的大,在右边,说明该事务还未提交,不可以直接访问,需要获取数据的roll_pointer,获取上一版本的记录,再重新比较,如果通过则将上一版本的记录作为快照,不通过就继续比较。

读已提交下的事务,每次查询的开始都会生成一个独立的ReadView,所以这也导致了读已提交会出现幻读;
可重复读下的事务,则是在第一次读时就生成一个ReadView,之后查询都复用这个ReadView。
这就是MySQL的MVCC,通过版本链,实现多版本,可并发读-写,写-读。通过ReadView生成策略的不同实现不同的隔离级别。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、阐述 mvcc(multi version concurrency control)多版本并发控制,其作用就是...
    小马蛋阅读 492评论 0 2
  • 什么是MVCC? MVCC(Mutil-Version Concurrency Control),就是多版本并发控...
    薛之谦chj阅读 253评论 0 0
  • InnoDB 一共支持四种等级的事务: 读未提交 读以提交 可重复读 串行化 其中读未提交实现最简单,每次读最新的...
    l1n3x阅读 451评论 0 0
  • MVCC 笔记 MVCC为了解决什么问题? 多版本并发控制,针对在并发访问数据库时对于数据版本的控制以及隔离性问题...
    刘凝云阅读 586评论 0 0
  • MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一...
    yes的练级攻略阅读 1,665评论 2 2