mysql官方文档翻译01-innodb多版本并发控制
参考文档: InnoDB Multi-Versioning
1.innodb是一个多版本存储引擎。
它会保存被修改数据行的多个老版本信息以支持事务功能,如并发与回滚。这些信息以回滚段(rollback segment)这种数据结构存储在撤销表空间。详情参见undo tablespace 。
innodb使用回滚段中的信息执行事务回滚时所需的撤销操作。它也使用该信息构建数据行的早期版本以实现一致性读。一致性读参见 consistent nonlocking reads
2.实际上,innodb为每条数据行新增了3个隐藏字段。
- DB_TRX_ID :表示插入或更新数据行的最后一个事务的事务标识符;而且,删除操作实际上是一种更新,其中数据行的特殊bit被标记为已删除;
- DB_ROLL_PTR:称为回滚指针; 回滚指针指向一条撤销日志记录。若数据行被更新,撤销日志记录包含重建该行被更新前的内容所需信息。
- DB_ROW_ID:该字段包含数据行id,该id随着新行插入而单调递增。如果innodb自动生成一个聚簇索引,则该索引包含行id。否则,DB_ROW_ID 不会出现在任何索引中;
3.撤销日志分为插入与更新撤销日志。
插入撤销日志仅在事务回滚时需要,一旦事务提交可以被删除。
更新撤销日志可以用于一致性读,仅当不存在innodb为其分配快照的事务后,更新撤销日志可以删除。而在一致性读中,该快照可能需要更新撤销日志中的信息构建数据行的早期版本。撤销日志参见 undo log
4.建议你定期提交事务,包括仅发出一致性读的事务。
否则,innodb不会删除更新撤销日志中的数据,而且回滚段可能会变得太大,填满它所在的撤销表空间。撤销表空间详情参见undo tablespace 。
5.在innodb多版本控制模式中,当删除sql执行时,一个数据行并不是立即被物理删除。
innodb丢弃删除操作的更新撤销日志记录后才会物理删除对应数据行及其索引。该删除操作称为清除purge。清除操作执行非常快,按照删除sql语句执行的时间顺序执行清理。
【mvcc其他参考资料】
1)非常棒的参考资料:因为有innodb存储引擎的源代码:
https://github.com/bytesfly/blog/blob/master/MySQL/mysql-transaction-innodb-mvcc.md
2)mvcc源码地址=https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/include/read0types.h#L43
3)本地调试mysql源码:
google搜索关键词=【window10 调试mysql源码】
参见 https://juejin.cn/post/7110373798716653599
4)
What is Multi-Version Concurrency Control (MVCC) in DBMS?
5)MVCC多版本并发控制原理总结(最终版)
6)MySQL进阶系列:多版本并发控制mvcc的实现, https://zhuanlan.zhihu.com/p/418300709