高性能Mysql学习日志之InnoDB行级锁的替代实现方案(三)

1.4多版本并发控制

Mysql的大多数事务型存储引擎的实现都不是基于简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。它的实现是通过保存数据再某个时间点的快照来实现的。当一个事务开始进行时,他无论花了多少时间执行多少次相同的查询,他看到的数据都是一致的。而不同的事务在不同时间点开始事务时,每个事务对同一张表、同一个时刻看到的数据可能都是不相同的,如图所示,事务A和事务C看到的数据x是不同的,但是A事务不管查询多少次x数据,都是一致的:。

以最经典的InnoDB引擎(隔离级别为REPEATABLE READ)为例,它的MVCC实现方法是通过在每行记录后面保存两个隐藏列来实现的。一个列保存行的创建时间,一个列用来保存列的过期时间(删除时间),他存储的不是实际的时间值,而是系统版本号,每当开始一个新的事务,系统版本号就会自动递增,该事务开始的时刻的版本号即为该事务的版本号,用来和该事务要查询的每行记录的版本号进行比较。

SELECT:

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

      a.InnoDB只会查找版本小于或等于当前事务版本的数据行,这样可以保证事务读取的行要么在事务开始前已经存在了,要么是事务他自身插入或修改过的行。

      b.行的删除版本要么未定义,要么要大于当前事务的版本号。这可以确保事务读取到的行,一定是在该事务开始时未被删除的数据行。

INSERT/DELETE:

       InnoDB为新插入(新删除的)每一行保存当前系统的版本号作为行版本号(行删除标志)

UPDATE:

       InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标志。

 

通过这两个隐藏行的操作,使得大多数的读操作都不用加锁。这样设计使得读数据操作非常简单且性能高,且保证会读到符合标准的行。缺点是需要额外多出存储空间,需要做更多的行检查工作和维护工作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值