关于MySQL中InnoDB的MVCC
MySQL中的实现
在InnoDB中的每行数据后都有额外的两个隐藏值来记录数据何时被创建(修改)和过期(删除),这里的时间不是我们日常中的时间,而是事务的版本号,每开启一个新事务,版本号会递增。
在MySQL默认隔离级别Repeatable Read
下:
设数据行创建版本号为create
,删除版本号为delete
,当前事务版本号为now
SELECT
,读取的数据行满足创建版本号<=当前事务版本号,删除版本号为空或>当前事务版本号,即(create <= now && (delete == null || delete > now))
INSERT
,保存当前事务版本号为行的创建版本号(commit
时生效),即create=now
DELETE
,保存当前事务版本号为行的删除版本号(commit
时生效),即delete=now
UPDATE
,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行(commit
时生效),即新行create=now
旧行delte=now
通过MVVC,虽然每行记录需要额外的存储空间,但是减少了锁的使用,使读数据性能很好。在MySQL的RR级别中,解决了幻读的读问题(快照读)。