MVCC介绍

1 什么是 MVCC?
MVCC, 即多版本并发控制。MVCC 的实现,是通过保存数据在某个时间点的快照来实现的,也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

2 Undo log
redo log,它记录了事务操作变化。但是事务有时是需要回滚的,这时,undo log 就发挥了作用。undo log 是逻辑日志,将数据库逻辑地恢复到原来的样子,所有修改都被逻辑地取消了。
也就是如果是 insert 操作,其对应的回滚操作就是 delete;
如果是 delete,则对应的回滚操作是 insert;
如果是 update,则对应的回滚操作是一个反向的 update 操作。
除了回滚操作,undo log 的另一个作用是 MVCC,InnoDB 存储引擎中 MVCC 的实现是通过 undo 来完成的。当用户读取一行记录时,若该记录已经被其它事务占用,当前事务可以通过 undo log 读取之前的行版本信息,以此实现非锁定读取。

3 MVCC 的实现原理
InnoDB 每一行数据都有一个隐藏的回滚指针,用于指向该行修改前的最后一个历史版本(存放在 UNDO LOG 中)。
在这里插入图片描述
如图,执行 update t20 set b=666 where a=1; 时,会将原记录放到 undo 表空间中,并通过隐藏的回滚指针指向该记录。在本节开始的实验中的第 6 步中,session2 查询的结果是 session1 修改之前的记录,这个记录就是来自 undo log 中。

4 MVCC 的优势
MVCC 最大的好处是读不加锁,读写不冲突,极大地增加了 MySQL 的并发性。
通过 MVCC,保证了事务 ACID 中的 I(隔离性)特性。

5 总结
在 RC 和 RR 隔离级别下(从查询方面看,MVCC是解决在并发条件下,同时可能会产生多个值,如何从多个值中选择一个值的技术。 但在RU和串行的隔离级别下,只会存在一个值。 RU: 每次只取最新的值,不存在多个值的情况。 串行:每次查询会加读锁,当有更新时会阻塞住,只有等到查询完锁释放后,才会做更新操作。所以也不存在多个值的情况。 所以RU和串行的隔离级别用不到MVCC),如果需要查询一些被其它事务正在更新的行,看到的是这些记录被更新之前的值。而这就是用 MVCC 实现的。

MVCC 实现的原理大致是:

InnoDB 每一行数据都有一个隐藏的回滚指针,用于指向该行修改前的最后一个历史版本,这个历史版本存放在 undo log 中。如果要执行更新操作,会将原记录放入 undo log 中,并通过隐藏的回滚指针指向 undo log 中的原记录。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版本。

MVCC 最大的好处是读不加锁,读写不冲突,极大的增加了 MySQL 的并发性,通过 MVCC,也保证了事务 ACID 中的 I(隔离性)特性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值