MVCC机制

1. 引言

1) MVCC:MySQL、Oracle、PostgreSQL、TiDB等。
2) 大多数的MySQL事务型存储引擎,如InnoDB,Falcon以及PBXT都在使用一种简单的行锁机制。
3) 在MySQL的这些存储引擎中,行锁与MVCC机制配合使用以增加并发性。

2. InnoDB MVCC

1) 意义:它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制
2) MVCC工作在RR隔离级别、RC隔离级别
3) InnoDB中“MVCC多版本一致性读”功能的实现基于undo-log。

3. InnoDB行结构

InnoDB为每行记录都实现了三个隐藏字段:6字节的事务ID(DB_TRX_ID );7字节的回滚指针(DB_ROLL_PTR);隐藏的ID。

3.1 InnoDB行更新

事务1更改该行的值时,会进行如下操作:

  • 用排他锁锁定该行
  • 记录redo log
  • 把该行修改前的值复制到undo log
  • 如果undo log一直不删除,则会通过当前记录的回滚指针回溯到该行创建时的初始内容。
  • InnoDB中存在purge线程,它会查询那些比现在最老的活动事务还早的undo log,并删除它们,从而保证undo log文件不至于无限增长。

3.2 InnoDB 读操作

MySQL中的读操作是使用MVCC机制实现,可以正确的查找到需要的行。通过read view判断行记录是否可见。

3.3 InnoDB 行删除

InnoDB由于要支持多版本协议,因此无论是更新,删除,都只是设置记录上的deleted bit标记位,而不是真正的删除记录。
Purge进程定期扫描InnoDB的undo,按照先读老undo,再读新undo的顺序,读取每条undo record。对于每一条undo record,判断其对应的记录是否可以被purge。
如果可以执行purge,然后按照先purge二级索引,最后purge聚簇索引的顺序,清除一个操作生成的旧版本完整记录。

4. InnoDB MVCC总结

MySQL中的读操作是使用MVCC机制实现。写操作永远读取已提交的数据,并没有走MVCC的逻辑;写操作的并发是通过锁控制的,不检查更新行是否是对本事务可见的。

转载于:https://my.oschina.net/u/3942910/blog/1928981

你可能感兴趣的:(数据库)