MySql进阶-MVCC(多版本并发控制)

Multi-Version Concurrency Control

1. 什么是MVCC?

先来了解Inodb的一致性的非锁定读:

一致性的非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB存储引擎会去读取行的一个快照数据。

一个行记录可能有不止一个快照数据,一般称这种技术为行多版本技术。由此带来的并发控制,称之为多版本并发控制(MultiVersion Concurrency Control,MVCC)。

那么MVCC可以认为是行级锁的一个变种,但是在很多情况下避免了加锁操作,因此开销更低?
那么怎么实现不加锁就能获得锁的效果呢?
有过锁相关的知识的可以想到:乐观锁

2. MVCC的实现

MVCC的实现,是通过保存数据在某个时间点的快照来实现的
也就是说,不管事务执行多久,每个事务看到的数据都是一致的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的

即对应每个事务都会拿到一个唯一的version 以及该version下对应的版本数据

3. InnoDB的MVCC

InnoDB的MVCC,是通过在每行记录后面保存2个隐藏的列来实现的

一个保存了行的创建时间,一个保存行的过期时间,当然存储的不是实际的时间值,而是系统的版本号(system version number),每开始一个事务,系统版本号都会递增.
事务开始的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较.

读取不会占用和等待表上的锁。但是在不同事务隔离级别下,读取的方式不同,并不是在每个事务隔离级别下都是采用非锁定的一致性读。

这样下来,基本上读是不需要加锁的
读写相互不阻塞,可以获得较好的并发性能。

不足之处就是需要额外的存储空间

书籍 高性能mysql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值