mysql 事務隔離級別的實現原理

2021-09-26 03:20:21 字數 1991 閱讀 2341

目錄

一、事務的四要素(acid)

二、mysql的事務的隔離級別

三、多版本併發控制(multi-version concurrency control)

3.1 功能

3.2 原理

1. 原子性(atomicity):all done  或者 all not  done

2. 一致性(consistency):事務開啟和結束之後,資料的完整性沒有被破壞

3. 隔離性(isolation):乙個事務的執行不能被另乙個事務干擾

4. 永續性 (durability):事務一旦提交,對於資料庫的變更是永久性的

隔離級別

髒讀不可重複讀

幻讀讀未提交(read uncommitted)

✔️✔️

✔️讀已提交(read committed)❌✔️

✔️可重複讀(repeatable read)❌❌

✔️序列化(serializable)❌❌

❌預設的隔離級別是:可重複讀(repeatable read)

髒讀:事務a讀了事務b更新但未提交的資料,事務b回滾之後,a讀到的就是髒資料

不可重複讀:事務a需要多次讀同一資料,事務b在事務a讀資料的過程中,對資料進行了更新,則a多次讀同一資料,結果不一致

幻讀:事務a讀某乙個資料,其他事務又執行了插入操作,事務a再次按照同一條件查詢時,資料變多了

使得innodb在read committed和 repeatable read兩種隔離級別下的一致性讀有了保障。換句話說,在這兩種隔離級別下,每個事物執行普通的select時,查詢到的都是已經提交的資料或是當前事務更新的資料。這個技術是一項非常強大的技術,可以使得查詢操作不用等待鎖釋放就能執行。當然這並不是一項通用技術,一些其他的資料庫產品以及mysql的其他儲存引擎並不支援。

3.2.1 版本鏈

innodb儲存引擎會給資料庫的每一行增加三個隱藏字段

1. row_id:如果存在主鍵或是非null唯一鍵,該字段非必須

2. trx_id:事務id,每次對某乙個記錄進行更新時,會把更新這條記錄的事務id賦值給隱藏的trx_id欄位

3. roll_ptr:每次對某條記錄進行修改時,這個隱藏列會存乙個指標,可以通過這個指標找到修改之前的資料

readview中包含4個主要內容:

(1) m_ids:生成當前readview時,當前系統中的活躍事務列表

(2)min_trx_id:生成當前readview時,當前當前系統中最小的活躍事務id,即m_ids中的最小值

(4)creator_trx_id:生成當前readview的事務id

注意:max_trx_id並不是m_ids中的最大值,事務id是遞增分配的。

e.g. 比如m_ids中有1,2,3三個活躍事務,之後事務3提交了,那麼生成新的readview時,m_ids中只有1,2兩個事務,而max_trx_id=4

3.2.3 一致性讀(consistent read)

對於讀已提交和可重複讀兩種隔離級別,可以借助readview,按照如下規則實現一致性讀:

(1)如果被訪問版本的trx_id與creator_trx_id相同,則表示當前事務正在訪問自己修改的版本,該版本資料對當前事務可見;

(2)如果被訪問版本的trx_id小於min_trx_id,則表示生成該readview時,當前版本的資料已經提交,該版本資料對當前事務可見;

(3)如果被訪問版本的trx_id大於max_trx_id,表示生成該readview時,該版本的事務還未開啟,該版本的資料對當前事務不可見;

(4)如果被訪問版本的trx_id大於min_trx_id,小於max_trx_id,就需要判斷當前版本的trx_id是否在m_ids中。如果在,則表示當前版本還為提交,該版本資料不可用;如果不在,則表示該版本資料已經提交,該版本資料可以被當前事務訪問

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

MySQL事務隔離級別的實現原理

mysql的acid mysql的隔離級別 在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提...