什么是MVCC?

MVCC

MVCC(multiple version concurrent control)是一种控制并发的方法,主要用来提高数据库的并发性能。

在了解MVCC时应该先了解当前读和快照读。

  • 当前读:读取的是数据库的最新版本,并且在读取时要保证其他事务不会修该当前记录,所以会对读取的记录加锁。
  • 快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗。

可以看到MVCC的作用就是在不加锁的情况下,解决数据库读写冲突问题,并且解决脏读、幻读、不可重复读等问题,但是不能解决丢失修改问题。

MVCC的实现原理:

  • 版本号
    系统版本号:是一个自增的ID,每开启一个事务,系统版本号都会递增。
    事务版本号:事务版本号就是事务开始时的系统版本号,可以通过事务版本号的大小判断事务的时间顺序。
  • 行记录隐藏的列
    DB_ROW_ID:所需空间6byte,隐含的自增ID,用来生成聚簇索引,如果数据表没有指定聚簇索引,InnoDB会利用这个隐藏ID创建聚簇索引。
    DB_TRX_ID:所需空间6byte,最近修改的事务ID,记录创建这条记录或最后一次修改这条记录的事务ID。
    DB_ROLL_PTR:所需空间7byte,回滚指针,指向这条记录的上一个版本。它们大致长这样,省略了具体字段的值。·
    在这里插入图片描述
  • undo日志
    MVCC做使用到的快照会存储在Undo日志中,该日志通过回滚指针将一个一个数据行的所有快照连接起来。它们大致长这样。
    在这里插入图片描述
    举一个简单的例子说明下,比如最开始的某条记录长这样
    在这里插入图片描述
    现在来了一个事务对他的年龄字段进行了修改,变成了这样
    在这里插入图片描述
    现在又来了一个事务2对它的性别进行了修改,它又变成了这样
    在这里插入图片描述
    从上面的分析可以看出,事务对同一记录的修改,记录的各个会在Undo日志中连接成一个线性表,在表头的就是最新的旧纪录。

在重复读的隔离级别下,InnoDB的工作流程:

  • SELECT
    作为查询的结果要满足两个条件:

    • 当前事务所要查询的数据行快照的创建版本号必须小于当前事务的版本号,这样做的目的是保证当前事务读取的数据行的快照要么是在当前事务开始前就已经存在的,要么就是当前事务自身插入或者修改过的。
    • 当前事务所要读取的数据行快照的删除版本号必须是大于当前事务的版本号,如果是小于等于的话,表示该数据行快照已经被删除,不能读取。
  • INSERT
    将当前系统版本号作为数据行快照的创建版本号。

  • DELETE
    将当前系统版本号作为数据行快照的删除版本号。

  • UPDATE
    保存当前系统版本号为更新前的数据行快照创建行版本号,并保存当前系统版本号为更新后的数据行快照的删除版本号,其实就是,先删除在插入即为更新。

总结一下,MVCC的作用就是在避免加锁的情况下最大限度解决读写并发冲突的问题,它可以实现提交读和可重复度两个隔离级。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值