对mysql的mvcc多版本控制的通俗理解

概述

mvcc(Multi-Version Concurrency Control):多版本并发控制。
概括的说就是过去的可见,现在正在进行中的不可见,未来的不可见。

实现原理概述

mysql的表结构除了我们自定义的列外,还有一些隐藏列:

  1. DB_TRX_ID6个byte.记录最后一次操作这条记录的事务ID
  2. DB_ROLL_PTR7个byte;回滚指针,指向这条记录的上一个版本数据;且上一个版本还能找到上上个版本的数据,就靠这个指针来寻址。
  3. DB_ROW_ID6个byte;隐藏的自增id。(只有当前表没有设置id的时候,mysql会使用这个隐藏的自增id,这个id是所有没有id的表共用的)。
  4. Info flags4个byte。包含删除标识等数据记录状态。

mysql的每个写操作都会生成undo log,其对应着一个版本的数据,这个数据版本就在表数据列的隐藏字段中,其实就是事务id。当前最新的行数据版本号中保存的是最后一个操作该行的数据id
在每个事务开启的时候都会生成一个readViewmvcc就依赖readViewundo log进行多版本控制。

readview的几个关键值:

up_limit_id:当前已经提交的事务号 + 1事务号 < up_limit_id 的版本数据,对于当前Read View都是可见的。理解起来就是创建Read View视图的时候,之前已经提交的事务对于该事务肯定是可见的。

low_limit_id:当前最大的事务号 + 1事务号 >= low_limit_id的版本数据,对于当前Read View都是不可见的。未来创建的事务对于该事务肯定是不可见的。

trx_ids:为活跃事务id列表,即Read View初始化时当前未提交的事务列表(即已经begin但是还未commit的事务)。即记录的当前活跃事务ID,后续即使他们提交对于本事务也是不可见的。

在这里插入图片描述

undo log demo图如下

假设现在有这样一条数据,其事务版本号是50,有一个事务trx_id是60的数据更新了它并提交,然后有一个trx_id=100的事务开启了更新了它,但是未提交,此时另一个事务发起select,因为trx_id=100的事务是当前活跃事务,所以其更新结果不可见,只能看到trx_id=60的数据。然后trx_id=100的事务提交了,另外有个trx_id=110的事务更新了它,但是未提交,因为select的事务的readview里保存的还是之前的数据,所以仍旧只能看到trx_id=60的数据。

ps这里就是rr和rc的区别了,rr在这个时候的readview还是不变的,但是rc这个时候的readview会重新生成,就能看到trx_id=100的强哥2了。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考了大佬的博文后自己理解出来了一些内容
大佬博文链接
https://zhuanlan.zhihu.com/p/66791480

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的多版本并发控制(MVCC)是一种并发控制机制,它主要是为了解决并发读写冲突的问题。在MVCC机制中,每个事务都可以看到数据库中的一个快照,这个快照是在事务开始时确定的。事务读取数据时,实际上是读取了该快照中的数据,而不是实际的数据。当事务需要修改数据时,MySQL会根据数据的版本号来判断是否可以进行修改。 MVCC的实现原理主要是在每一行数据后面保存多个版本号,并且还需要保存该版本号对应的事务ID。当开始一个事务时,MySQL会为该事务分配一个唯一的事务ID,该事务ID会被用于标记事务对应的数据版本号。当一个事务需要读取数据时,MySQL会根据该事务的事务ID和版本号来判断是否允许读取该数据。如果该事务的事务ID小于等于该数据的版本号,那么就可以读取该数据。如果该事务需要修改数据,则MySQL会为该数据在数据库中创建一个新版本,并将该新版本版本号和事务ID保存下来。这样,其他事务就可以继续读取原来的版本,而该事务则可以读取新版本并修改数据,从而实现并发控制。 需要注意的是,MVCC只能解决读写冲突的问题,而不能解决写写冲突的问题。此外,MVCC也会占用一定的存储空间,因为每个数据行都需要保存多个版本号和事务ID。因此,在使用MVCC机制时,需要注意存储空间和性能方面的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值