標籤: 「咱們都是小青蛙」公衆號文章post
前幾天在文章 MySQL事務隔離級別和MVCC 中闡述了InnoDB的MVCC的工做原理,可是在一個地方出現了錯誤,特此更正一下。code
在事務生成readview
時,會把當前系統中正在執行的讀寫事務寫入到m_ids
列表中,在判斷某條記錄可見性時,以前文章中寫的是當記錄的trx_id
屬性大於m_ids
中的最大值時,該記錄是不可見的。cdn
在事務生成readview
時,會把當前系統中正在執行的讀寫事務寫入到m_ids
列表中,另外還會存儲兩個值:事務
min_trx_id
:該值表明生成readview
時m_ids
中的最小值。get
max_trx_id
:該值表明生成readview
時系統中應該分配給下一個事務的id值。it
小貼士: 注意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。 io
因此判斷可見性的步驟就是:class
trx_id
列小於min_trx_id
,說明確定可見。trx_id
列大於max_trx_id
,說明確定不可見。trx_id
列在min_trx_id
和max_trx_id
之間,就要看一下該trx_id
在不在m_ids
列表中,若是在,說明不可見,不然可見。若是這個問題對各位同窗形成困擾多有不便,這個問題也是在又仔細看了一遍MVCC的代碼才發現的,以前看的時候多有疏忽~原理
思考:以前有錯誤的版本會形成啥影響呢?懂了這個問題纔算理解MVCC了哈~lazyload
本篇文章來自小孩子本身的公衆號「咱們都是小青蛙」,歡迎你們訂閱,有乾貨技術文章,時不時扯扯犢子哈: