什么是多版本并发控制?
多版本的含义:多版本讲的就是MySQL服务器会保存数据在多个时间点的快照(可以理解为多个不同的版本)
并发控制:不同的存储引擎的MVCC实现方式是不同的,典型的有乐观并发控制和悲观并发控制。
InnoDB的MVCC是怎么实现的?
InnoDB的MVCC是通过在每行后面保存两个隐藏的列来实现的,一个保存了行的创建时间,一个保存了行的过期时间,不过存储的并不是时间的时间值而是系统的版本号。每开始一个事务系统版本号就会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
好了,说了这么多还不如来点实际的,接下来具体看看Innodb MVCC是如何操作的
SELECT
(1) Innodb 只会查找版本早于当前事务版本的数据行,这样就可以保证事务读取到的行,要么是在事务开始前已经存在,要么是事务自身插入或者修改过的。
(2) 行的删除版本要么未定义,要么大于当前事务版本号。这样就可以保证事务读取到的行,在事务开始之前未被删除。
只有符合这两个条件的记录,才能返回作为查询结果。
INSERT
Innodb 会为新的记录保存当前版本号作为行的版本号。
DELETE
Innodb为删除的每一行保存当前系统版本号作为删除标识。
UPDATE
Innodb update操作会插入一个新行,Innodb会为新的记录保存当前系统的版本号作为行版本号,同时保存当前系统的版本号到原来的行作为行删除标识。
MVCC适用场景
MVCC只在repeatable read(可重复读) 和 read committed (提交读也叫不可重复读)两个隔离级别下工作,其他两个隔离级别都和MVCC不兼容,因为read uncommitted (未提交读) 总是读取最新的数据行,而不是符合当前事务版本的数据行。而serializable(串行化)则会对所有读取行都加锁。所以在网上也能看到说MVCC是MySQL用来实现可重复读的。
优缺点
优点: 因为加了两个额外的列,使大多数操作都可以不用加锁,使得数据操作简单,性能很好。
缺点:因为加了两个额外的列,因此需要额外的存储空间,另外,就是需要做更多的行检查工作,以及一些额外的维护工作。
思考:
1.Innodb这种实现方式是属于乐观锁,还是悲观锁?
网友评论