MVCC文章勘誤

標籤: 「咱們都是小青蛙」公衆號文章post

前幾天在文章 MySQL事務隔離級別和MVCC 中闡述了InnoDB的MVCC的工做原理,可是在一個地方出現了錯誤,特此更正一下。code

原文錯誤的地方:

在事務生成readview時,會把當前系統中正在執行的讀寫事務寫入到m_ids列表中,在判斷某條記錄可見性時,以前文章中寫的是當記錄的trx_id屬性大於m_ids中的最大值時,該記錄是不可見的。cdn

應該更正爲:

在事務生成readview時,會把當前系統中正在執行的讀寫事務寫入到m_ids列表中,另外還會存儲兩個值:事務

  • min_trx_id:該值表明生成readviewm_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_idmax_trx_id之間,就要看一下該trx_id在不在m_ids列表中,若是在,說明不可見,不然可見。

若是這個問題對各位同窗形成困擾多有不便,這個問題也是在又仔細看了一遍MVCC的代碼才發現的,以前看的時候多有疏忽~原理

思考:以前有錯誤的版本會形成啥影響呢?懂了這個問題纔算理解MVCC了哈~lazyload

題外話

本篇文章來自小孩子本身的公衆號「咱們都是小青蛙」,歡迎你們訂閱,有乾貨技術文章,時不時扯扯犢子哈:

相關文章
相關標籤/搜索