标签: 「我们都是小青蛙」公众号文章
前几天在文章 MySQL事务隔离级别和MVCC 中阐述了InnoDB的MVCC的工作原理,但是在一个地方出现了错误,特此更正一下。
原文错误的地方:
在事务生成readview
时,会把当前系统中正在执行的读写事务写入到m_ids
列表中,在判断某条记录可见性时,之前文章中写的是当记录的trx_id
属性大于m_ids
中的最大值时,该记录是不可见的。
应该更正为:
在事务生成readview
时,会把当前系统中正在执行的读写事务写入到m_ids
列表中,另外还会存储两个值:
-
min_trx_id
:该值代表生成readview
时m_ids
中的最小值。 -
max_trx_id
:该值代表生成readview
时系统中应该分配给下一个事务的id值。小贴士: 注意max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的记录提交了。那么一个新的读事务在生成readview时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。
所以判断可见性的步骤就是:
- 如果记录的
trx_id
列小于min_trx_id
,说明肯定可见。 - 如果记录的
trx_id
列大于max_trx_id
,说明肯定不可见。 - 如果记录的
trx_id
列在min_trx_id
和max_trx_id
之间,就要看一下该trx_id
在不在m_ids
列表中,如果在,说明不可见,否则可见。
如果这个问题对各位同学造成困扰多有不便,这个问题也是在又仔细看了一遍MVCC的代码才发现的,之前看的时候多有疏忽~
思考:之前有错误的版本会造成啥影响呢?懂了这个问题才算理解MVCC了哈~
题外话
本篇文章来自小孩子自己的公众号「我们都是小青蛙」,欢迎大家订阅,有干货技术文章,时不时扯扯犊子哈: