資料庫事務隔離級別與MVCC

2022-03-28 14:55:12 字數 1941 閱讀 9345

事務隔離級別包括:讀未提交(read uncommitted)讀提交(read committed)可重複讀(repeatable read)序列化(serializable)

在實現上,資料庫裡面會建立乙個檢視,訪問的時候以檢視的邏輯結果為準。在可重複讀隔離級別下,這個檢視是在事務啟動時建立的,整個事務存在期間都用這個檢視。在讀提交隔離級別下,這個檢視是在每個sql語句開始執行的時候建立的。這裡需要注意的是讀未提交隔離級別下直接返回記錄上的最新值,沒有檢視概念;而序列化隔離級別下直接用加鎖的方式來避免並行訪問。

以下內容均是基於mysql中innodb引擎

檢視(view),是資料庫中的虛擬表。資料庫中只存放檢視的定義,資料仍然儲存在原來的基本表中。

一致性讀檢視(consistent read view),innodb引擎實現mvcc時使用,用於支援讀提交和可重複讀隔離級別的實現。

multi-version concurrency control 多版本併發,mvcc 是一種併發控制的方法,用於實現對資料庫的併發訪問。innodb mvcc的實現基於undo log,通過回滾段來構建需要的版本記錄,通過read view來判斷哪些版本的資料可見。

對於innodb引擎的表來說,它的聚簇索引記錄中的資料會包含兩個必要的隱藏列trx_idroll_pointer

trx_id:每次乙個事務對某條記錄進行改動時,會把該事務的事務id賦值給trx_id

roll_pointer:每次對記錄進行改動時,會把舊的版本寫入undo log日誌中,每條undo log也有乙個roll_pointer指標,通過這個指標可以找到該記錄修改前的記錄

通過roll_pointer指標可以將記錄的多個版本連線成乙個鍊錶,這個鍊錶就是記錄的版本記錄,每次需要歷史版本的資料可以通過當前版本和undo log計算出來

雖然通過構建版本鏈,可以找到記錄的歷史版本,但是歷史版本那麼多,哪個版本才是要讀的資料呢?這個時候就需要檢視大顯身手,通過檢視來進行版本可見性判斷

對於讀未提交的事務來說,可以讀到未提交的事務修改的記錄,所以直接讀取記錄的最新版本就行;對於序列化隔離級別來說,需要使用加鎖的方式來訪問記錄。對於讀提交和可重複讀的事務來說,需要使用read view來進行判斷哪個版本是當前事務可見的。

innodb為每個事務構造了乙個陣列,用來儲存這個事務啟動瞬間,當前正在「活躍」的所有事務id。「活躍」指的就是,啟動了但還沒提交。

read view主要結構:

可見性判斷:

如果記錄trx_id小於m_up_limit_id或者等於m_creator_trx_id,表明readview建立的時候該事務已經提交,記錄可見

如果記錄的trx_id大於等於m_low_limit_id,表明事務是在readview建立後開啟的,其修改,插入的記錄不可見

當trx_id在m_up_limit_id和m_low_limit_id之間的時候,如果id在m_ids陣列中,表明readview建立時候,事務處於活躍狀態,因此記錄不可見。

mvcc指的就是在使⽤read committd、repeatable read這兩種隔離級別的事務在執⾏普通的seelct操作時訪問記錄的版本鏈的過程,這樣⼦可以使不同事 的讀-寫、寫-讀操作併發執⾏,從⽽提公升系統效能。

rc和rr這兩個隔離級別不同的地方在於:

**資料庫核心月報

美團技術團隊——innodb中的事務隔離級別和鎖的關係

極客時間mysql45講

詳解MySQL 資料庫隔離級別與MVCC

mysql是我們日常生產與學習中最常接觸到的資料庫之一,今天講一講在mysql 或者說其他類似的資料庫 中存在的隔離級別以及用來提高效率的多版本併發控制 mvcc 首先我們需要提到乙個概念 事務。什麼是事務?事務就是完成乙個基礎操作的一系列操作語句的乙個集合。例如我要將200元從賬戶a轉移到賬戶b,...

資料庫 事務與隔離級別

事務概述 redo log概述 undo log概述 事務控制語句 配置引數 控制語句 事務隔離級別 隔離級別簡介 mvcc併發控制 鎖型別簡介 事務是作為單個邏輯操作單元的一系列操作。事務可以包含一條或多條sql語句,所有的語句被當做乙個操作單元,要麼全部成功 要麼全部失敗 即作為乙個原子操作 資...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...