MySQL的MVCC机制实现READ COMMITTED和 REPEATABLE READ隔离级别

MVCC实现依赖于 —— undo日志、隐藏字段、ReadView

MVCC,多版本的并发控制,Multi-Version Concurrency Control

undo日志:

例子:表中本来有记录(1,张三,一班)

 事务10更新记录:(1,李四,一班)后又更新(1,王五,一班)

事务20更新记录:(1,钱七,一班)又更新(1,宋八,一班)

此时记录修改了四次,undo日志形成版本链:

隐藏字段:

 每行记录后面保存两个隐藏的列:一个保存了行的事务ID(TRX_ID),一个保存了行的回滚指针(ROLL_POINTER)

 ReadView:

RU(READ UNCOMMITTED) 不处理,所有事务直接读取数据库的最新值即可。SERIALIZABLE 隔离级别对所有操作加锁

 RC(READ COMMITTED) 和 RR(REPEATABLE READ) 隔离级别的实现是通过版本控制来完成。两种隔离界别下的核心处理逻辑就是通过ReadView判断所有版本中哪个版本是当前事务可见的处理。

ReadView中主要包含当前系统中还有哪些活跃的读写事务,把它们的事务id放到一个列表中,我们把这个列表命名为为m_ids

  • 使用READ COMMITTED隔离级别的事务在每次查询开始时都会生成一个独立的 ReadView。
  • REPEATABLE READ 隔离级别的事务在第一次读取数据时生成一个ReadView。

例子:

1、READ COMMITTED隔离级别(解决脏读)

 2、REPEATABLE READ 隔离级别(解决不可重复读)

  2、REPEATABLE READ 隔离级别(解决幻读)

 

比较:RC,RR级别下的InnoDB快照读有什么不同?
读已提交(RC):RC隔离级别下,每个快照读都会生成并获取最新的Read View,每次都读取undo log中最近的版本,因此两次对同一字段的读可能读到不同的数据(不可重复读),但能保证每次都读到最新的数据。

可重复读(RR):在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。每次都读取undo log指定的版本,这样保证不会产生幻读,但可能读不到最新的数据。

总结:(MVCC机制原理) 

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。MVCC使得数据库读不会对数据加锁,提高了数据库的并发处理能力。借助MVCC,数据库可以实现READ COMMITTED,REPEATABLE READ等隔离级别,用户可以查看当前数据的前一个或者前几个历史版本,保证了ACID中的I特性(隔离性)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值