MySQL的大多数事务型存储引擎都不是简单的行级锁。各大数据库基本都采用MVCC,但不尽相同。
InnoDB的简化版:(MVCC实现原理)
在每行记录后面保存两个隐藏的列来实现,一个保存了行的创建版本号,一个保存行的过期版本号(删除版本号)。
版本号:
- 系统版本号:每开始一个新的事务,系统版本号就会自动增加
- 事务版本号:事务开始时刻的系统版本号
当执行select操作时候:
- 只查找版本早于当前事务版本的数据行。 确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
- 行的删除版本号要么未定义,要么大于当前事务版本号。 确保事务查询到的行,在事务开始之前没被删除。
insert操作:
为新插入的每一行保存当前系统版本号为行创建版本号。
delete操作:
为删除的行保存当前系统版本号作为行删除版本号。
update操作:
为插入一行新数据保存当前版本号作为该新行行创建版本号,同时保存当前系统版本号到原来的行作为行删除版本号。
可见update = delete+insert
采用MVCC这个原理,大多操作可以不用加锁,使得读数据操作简单,性能好,缺点是额外的存储空间消耗,更多的行检查和维护工作。MVCC只能在REPEATABLE READ 和READ COMMITTED两个隔离级别下工作。其他两个隔离级别跟MVCC不兼容。
网友评论