當前位置:編程學習大全網 - 源碼下載 - Mysql到底是怎麽實現MVCC的

Mysql到底是怎麽實現MVCC的

Mysql到底是怎麽實現MVCC的

Mysql到底是怎麽實現MVCC的?這個問題無數人都在問,但google中並無答案,本文嘗試從Mysql源碼中尋找答案。

在Mysql中MVCC是在Innodb存儲引擎中得到支持的,Innodb為每行記錄都實現了三個隱藏字段:

6字節的事務ID(DB_TRX_ID )

7字節的回滾指針(DB_ROLL_PTR)

隱藏的ID

6字節的事物ID用來標識該行所述的事務,7字節的回滾指針需要了解下Innodb的事務模型。

1. Innodb的事務相關概念

為了支持事務,Innbodb引入了下面幾個概念:

redo log

redo log就是保存執行的SQL語句到壹個指定的Log文件,當Mysql執行recovery時重新執行redo log記錄的SQL操作即可。當客戶端執行每條SQL(更新語句)時,redo log會被首先寫入log buffer;當客戶端執行COMMIT命令時,log buffer中的內容會被視情況刷新到磁盤。redo log在磁盤上作為壹個獨立的文件存在,即Innodb的log文件。

undo log

與redo log相反,undo log是為回滾而用,具體內容就是copy事務前的數據庫內容(行)到undo buffer,在適合的時間把undo buffer中的內容刷新到磁盤。undo buffer與redo buffer壹樣,也是環形緩沖,但當緩沖滿的時候,undo buffer中的內容會也會被刷新到磁盤;與redo log不同的是,磁盤上不存在單獨的undo log文件,所有的undo log均存放在主ibd數據文件中(表空間),即使客戶端設置了每表壹個數據文件也是如此。

rollback segment

回滾段這個概念來自Oracle的事物模型,在Innodb中,undo log被劃分為多個段,具體某行的undo log就保存在某個段中,稱為回滾段。可以認為undo log和回滾段是同壹意思。

Innodb提供了基於行的鎖,如果行的數量非常大,則在高並發下鎖的數量也可能會比較大,據Innodb文檔說,Innodb對鎖進行了空間有效優化,即使並發量高也不會導致內存耗盡。

對行的鎖有分兩種:排他鎖、***享鎖。***享鎖針對對,排他鎖針對寫,完全等同讀寫鎖的概念。如果某個事務在更新某行(排他鎖),則其他事物無論是讀還是寫本行都必須等待;如果某個事物讀某行(***享鎖),則其他讀的事物無需等待,而寫事物則需等待。通過***享鎖,保證了多讀之間的無等待性,但是鎖的應用又依賴Mysql的事務隔離級別。

隔離級別

隔離級別用來限制事務直接的交互程度,目前有幾個工業標準:

- READ_UNCOMMITTED:臟讀

- READ_COMMITTED:讀提交

- REPEATABLE_READ:重復讀

- SERIALIZABLE:串行化

Innodb對四種類型都支持,臟讀和串行化應用場景不多,讀提交、重復讀用的比較廣泛,後面會介紹其實現方式。

2. 行的更新過程

下面演示下事務對某行記錄的更新過程:

1. 初始數據行

F1~F6是某行列的名字,1~6是其對應的數據。後面三個隱含字段分別對應該行的事務號和回滾指針,假如這條數據是剛INSERT的,可以認為ID為1,其他兩個字段為空。

2.事務1更改該行的各字段的值

當事務1更改該行的值時,會進行如下操作:

用排他鎖鎖定該行

  • 上一篇:手機裏下載的aspx文件如何打開
  • 下一篇:細說ASP.NET頁面間數據傳遞的幾種方法
  • copyright 2024編程學習大全網