MVCC

   日期:2020-10-12     浏览:96    评论:0    
核心提示:MVCC,多版本并发控制协议,是数据库中经常使用的的一种并发控制手段,是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现读已提交和可重复读取隔离级别的实现MVCC最大的好处是:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的提高了系统的并发性Mysql在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。这个隔离性就是靠MVCC(Multi-Vers

MVCC,多版本并发控制协议,是数据库中经常使用的的一种并发控制手段,是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现读已提交和可重复读取隔离级别的实现

MVCC最大的好处是:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的提高了系统的并发性

Mysql在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。

这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。

Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。

MVCC就一句话总结:同一份数据临时保存多个版本的一种方式,进而实现并发

快照读和当前读

在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read),快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁,当前读,读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录

快照读: 简单的select操作,属于快照读,不加锁

当前读: 特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁

select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;

所有以上的语句,都属于当前读,读取记录的最新版本,并且读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁
其中,除了第一条语句,对读取记录加S锁 (共享锁)外,其他的操作,都加的是X锁 (排它锁)

基本实现

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间

一个行记录数据有多个版本对快照数据,这些快照数据在undo log中

这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID

INSERT

InnoDB为新插入的每一行保存当前系统版本号作为版本号

SELECT

InnoDB会根据以下两个条件检查每行记录:

a.InnoDB只会查找创建的版本号早于当前事务版本的数据行

(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的

b.行的删除版本要么未定义,要么大于当前事务版本号

这可以确保事务读取到的行,在事务开始之前未被删除

只有a,b同时满足的记录,才能返回作为查询结果

DELETE

InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识

UPDATE

InnoDB执行UPDATE,实际上是新插入了一行记录,并保存其创建时间为当前事务的ID,同时保存当前事务ID到要UPDATE的行的删除时间

MVCC由浅入深学习

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服