在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 ...