1. 程式人生 > 其它 >Mysql事務隔離級別和MVCC

Mysql事務隔離級別和MVCC

事務的隔離級別
1、讀未提交
2、讀已提交
3、可重複讀
4、序列化

隔離性引發的併發問題
髒讀:讀了未提交
不可重複讀:讀了已提交
幻讀:操作其他事物刪除的資料報錯。

事務的快照時間點(即下文中說到的Read View的生成時間)是以第一個select來確認的。所以即便事務先開始,但是select在後面的事務的update之類的語句後進行,那麼它是可以獲取前面的事務的對應的資料。

MVCC
LBCC是基於鎖的併發控制,因為鎖的粒度過大,會導致效能的下降,因此提出了比LBCC效能更優越的方法MVCC。MVCC是Multi-Version Concurremt Control的簡稱,意思是基於多版本的併發控制協議,通過版本號,避免同一資料在不同事務間的競爭,只存在於InnoDB引擎下。它主要是為了提高資料庫的併發讀寫效能,不用加鎖就能讓多個事務併發讀寫。MVCC的實現依賴於:三個隱藏欄位、Undo log和Read View,其核心思想就是:只能查詢事務 id 小於等於當前事務 ID 的行;只能查詢刪除時間大於等於當前事務 ID 的行,或未刪除的行。接下來讓我們從原始碼級別來分析下MVCC。
隱藏列
MySQL中會為每一行記錄生成隱藏列,接下來就讓我們瞭解一下這幾個隱藏列吧。
(1)DB_TRX_ID:事務 ID,是根據事務產生時間順序自動遞增的,是獨一無二的。如果某個事務執行過程中對該記錄執行了增、刪、改操作,那麼InnoDB儲存引擎就會記錄下該條事務的 id。
(2)DB_ROLL_PTR:回滾指標,本質上就是一個指向記錄對應的undo log的一個指標,大小為 7 個位元組,InnoDB便是通過這個指標找到之前版本的資料。該行記錄上所有舊版本,在undo log中都通過連結串列的形式組織。
(3)DB_ROW_ID:行標識(隱藏單調自增ID),如果表沒有主鍵,InnoDB 會自動生成一個隱藏主鍵,大小為 6 位元組。如果資料表沒有設定主鍵,會以它產生聚簇索引。
(4)實際還有一個刪除 flag 隱藏欄位,既記錄被更新或刪除並不代表真的刪除,而是刪除 flag 變了。