mvcc多版本控制

2019-03-09  本文已影响0人  霍运浩

MySQL的大多数事务型存储引擎都不是简单的行级锁。各大数据库基本都采用MVCC,但不尽相同。

InnoDB的简化版:(MVCC实现原理)
在每行记录后面保存两个隐藏的列来实现,一个保存了行的创建版本号,一个保存行的过期版本号(删除版本号)。

版本号:

  1. 系统版本号:每开始一个新的事务,系统版本号就会自动增加
  2. 事务版本号:事务开始时刻的系统版本号

当执行select操作时候:

  1. 只查找版本早于当前事务版本的数据行。 确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
  2. 行的删除版本号要么未定义,要么大于当前事务版本号。 确保事务查询到的行,在事务开始之前没被删除。

insert操作:
为新插入的每一行保存当前系统版本号为行创建版本号。

delete操作:
为删除的行保存当前系统版本号作为行删除版本号。

update操作:
为插入一行新数据保存当前版本号作为该新行行创建版本号,同时保存当前系统版本号到原来的行作为行删除版本号。

可见update = delete+insert

采用MVCC这个原理,大多操作可以不用加锁,使得读数据操作简单,性能好,缺点是额外的存储空间消耗,更多的行检查和维护工作。MVCC只能在REPEATABLE READ 和READ COMMITTED两个隔离级别下工作。其他两个隔离级别跟MVCC不兼容。

上一篇 下一篇

猜你喜欢

热点阅读