mysql中的MVCC

MVCC

多版本控制,提高并发的一种技术,可以保证读读、读写、写读并发,只有写写阻塞。其实现可以通过乐观锁和悲观锁来实现,其中innodb的MVCC是通过版本号来实现,通过在每行记录后面保存两个隐藏的列来实现,具体实现见书。

多版本控制一般用在读已提交和可重复读中,其保证了读读、读写、写读并发,但是写写则需要加锁阻塞,MVCC是一种乐观锁的实现方法

MVCC最主要的作用即解决了读写重复,提供了并发性。

MVCC机制的原理主要是依赖记录中的隐藏字段、undo日志、Read View来实现

  1. 隐藏字段包括四个字段

    • DB_TRX_ID 记录创建或者最后一次修改该记录的ID
    • DB_ROLL_PTR 回滚指针,记录这条记录的上一个版本
    • DR_ROW_ID 隐藏的自增序号,如果没有主键,则其为主键构成聚簇索引
    • 删除flag字段,当记录被更新或者被删除时该flag标识会变为当前事务ID
    • 当字段被修改或者被删除时,其并不是比真正的删除,而是当前被更新的记录的flag字段被修改为该事务ID,将当前记录放入了undo日志中
  2. undo日志,该日志也被分为两种

    • insert undo log 只用于事务在insert新记录时产生的undo log,只在事务回滚时可能会使用,事务提交后被删除

    • update undo log 在事务回滚和快照读时需要,当回滚和快照读不需要时会被删除(purge线程删除)

    • 这个日志中实际就是存放的旧版本的记录链,当某个记录被修改时,旧记录就会被拷贝到该日志中来

  3. read View,在说读示图之前先说一下什么叫快照读和当前读

    • 快照读:即不加锁的非阻塞读,即select时不会加锁,而是直接读取
    • 当前读:每次读取的是当前记录的最新版本,其在读取时会对读取的记录加锁,select lock in share mode/select for update等
    • read View是在快照读的时候生成,其主要包括三个方面
      • 一个列表,记录当读视图生成时系统正在活跃的所有事务ID
      • 记录事务列表中最小的事务号
      • 记录读视图生成时尚未分配的下一个事务ID
  4. MVCC运转的整体流程:

    • 那么读视图的作用,实际就是当读取某一条记录时,对记录进行判断,到底读取哪一条记录,具体是当读取某条记录时将该记录的DB_TRX_ID字段和读视图中最小事务号进行比较,
    • 如果小于,则该记录直接被读取,否则,判断其是否大于等于下一个事务ID,如果是则该记录是在读视图生成后,又开启的视图修改的,那么将不能访问,则再对其上一个旧版本进行判断,
    • 如果在最小事务号和下一个事务号之间,那么先看DB_TRX_ID是不是在事务列表中,如果在,则说明该记录是读视图生成时正在运行的视图还没有提交的记录,不能访问;
    • 如果不在事务列表中,则说明是读视图生成前就已经提交的事务所更新/创建的记录,那么是可以访问的。

注意读已提交和可重复读这两种方法其实都是可以使用MVCC的,但是他们的区别在于可重复读的读视图在第一个快照读时生成,之后无论快照读多少次都是第一次的读视图,而读已提交的读视图则是在每次快照读时都会被生成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值