MySQL事務隔離級別實現原理

2021-09-05 11:53:49 字數 1335 閱讀 1283

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡討論的事務隔離級別指的是mysql innodb下的事務隔離級別,一般而言,隔離級別分為:

讀未提交:

乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀、幻讀、不可重複讀問題,很少使用這個級別。

讀已提交:

乙個事務只能讀取另乙個事務已經提交的修改,重複讀取時可能讀到另外事務執行前和執行後的資料,且2次資料不一致。其避免了髒讀,但仍然存在不可重複讀和幻讀問題。

可重複讀:

同乙個事務中多次讀取相同的資料返回的結果是一樣的。但是可能讀到新增的記錄。其避免了髒讀和不可重複讀問題,但幻讀依然存在。

序列化:

事務序列執行。避免了以上所有問題。

以上是sql-92標準中定義的四種隔離級別。在mysql中,預設的隔離級別是repeatable-read(可重複讀),並且解決了幻讀問題。簡單的來說,mysql的預設隔離級別解決了髒讀、不可重複讀問題。不可重複讀重點在於update和delete,而幻讀的重點在於insert。在這裡,我們只討論可重複讀。

這裡有些術語需要了解下:

mvcc

:multiversion concurrency control的全稱是「多版本併發控制」。

這項技術使得innodb在事務隔離級別下執行一致性讀操作有了保證,換言之,就是為了查詢一些正在被另乙個事務更新的行,並且可以看到它們被更新之前的值。這是乙個可以用來增強併發性的強大的技術,因為這樣的一來的話查詢就不用等待另乙個事務釋放鎖。這項技術在資料庫領域並不是普遍使用的。一些其它的資料庫產品,以及mysql其它的儲存引擎並不支援它。

行記錄的可見性

:mvcc實現了多個併發事務更新同一行記錄會時產生多個記錄版本,那問題來了,新開始的事務如果要查詢這行記錄,應該獲取到哪個版本呢?即哪個版本對這個事務是可見的。這個問題就是行記錄的可見性問題。

innodb會給資料庫中的每一行增加三個字段,它們分別是db_trx_id、db_roll_ptr、db_row_id。

db_trx_id表示最後乙個事務的id,每開啟乙個新事務,事務的版本號就會遞增;

db_roll_ptr指向當前記錄項的undo log資訊;

db_row_id標識插入的新的資料行的id。

1、事務隔離級別為讀提交時,寫資料只會鎖住相應的行

2、事務隔離級別為可重複讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新資料時會鎖住整張表。乙個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。

3、事務隔離級別為序列化時,讀寫資料都會鎖住整張表

4、隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。

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

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

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

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

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

目錄 一 事務的四要素 acid 二 mysql的事務的隔離級別 三 多版本併發控制 multi version concurrency control 3.1 功能 3.2 原理 1.原子性 atomicity all done 或者 all not done 2.一致性 consistency ...