mysql的MVCC

MVCC

1.什么是MVCC?

多版本并发控制,通过数据行的多个版本来实现数据库的并发控制。为了查询一些正在被其他事务更新的行被更新之前的数据值。这样查询就不用等其他事务释放锁。

2.快照读和当前读

2.1 快照读:

  • 不加锁的非阻塞读,读的是快照的内容(比如不加锁的select操作)
  • 快照读式基于MVCC,避免了锁操作
  • 快照读基于MVCC,有多个版本,读取的可能不是最新的版本
  • 隔离级别不能式串行,否则会退化成当前读

2.2 当前读:

  • 阻塞式的读,读的是记录的最新版本
  • 当前读要保证其他事务不能修改当前记录
  • 会对当前记录加锁
    在这里插入图片描述

2.3 mysql里的可重复读其实已经解决了幻读

在这里插入图片描述

3.MVCC的实现:

依赖于:隐藏字段、Undo Log 、readView

1、 隐藏字段 :

  • rowId

Innodb采用主键索引(聚簇索引),会利用主键维护索引,若表没有主键,就用第一个非空唯一索引,若没有唯一索引,则用row_id这个隐藏字段作为主键索引。

  • 事务id(trx_id):

每次事务对记录进行修改,都会把当前事务id赋值给 trx_id(修改操作trx_id每次递增,读操作trx_id为0)

  • 回滚指针(roll_pointer)

undo log会记录老版本的记录,然后回滚指针执行老版本的位置
在这里插入图片描述

2、Undo Log版本链
在这里插入图片描述
3.MVCC实现原理
readview
在这里插入图片描述
readview规则:
在这里插入图片描述
在这里插入图片描述
整体操作流程
在这里插入图片描述

  • read committed 隔离级别的时候,每一次select 都会重新获取一个read view

  • repeatable read 隔离级别下,只在第一次读的时候获取一次read view

  • readview主要解决版本链中哪些版本是对当前事务可见的。

  • readview主要针对read committed和repeatable read(他们有历史版本,其他两个都是读最新版本)

总结:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值