MYSQL-InnoDB事務隔離級別

關於這四個隔離級別的介紹:mysql

  • 未提交讀(READ UNCOMMITTED)。另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據(髒讀)。sql

  • 提交讀(READ COMMITTED)。本事務讀取到的是最新的數據(其餘事務提交後的)。問題是,在同一個事務裏,先後兩次相同的SELECT會讀到不一樣的結果(不重複讀)。session

  • 可重複讀(REPEATABLE READ)。在同一個事務裏,SELECT的結果是事務開始時時間點的狀態,所以,一樣的SELECT操做讀到的結果會是一致的。可是,會有幻讀現象(稍後解釋)。併發

  • 串行化(SERIALIZABLE)。讀操做會隱式獲取共享鎖,能夠保證不一樣事務間的互斥。性能


這四個級別逐漸加強,每一個級別解決一個問題測試

  • 髒讀,最容易理解。另外一個事務修改了數據,但還沒有提交,而本事務中的SELECT會讀到這些未被提交的數據。spa

  • 不重複讀。解決了髒讀後,會遇到,同一個事務執行過程當中,另一個事務提交了新數據,所以本事務前後兩次讀到的數據結果會不一致。事務

  • 幻讀。解決了不重複讀,保證了同一個事務裏,查詢的結果都是事務開始時的狀態(一致性)。可是,若是另外一個事務同時提交了新數據,本事務再更新時,就會「驚奇的」發現了這些新數據,貌似以前讀到的數據是「鬼影」同樣的幻覺。it


仍是經過測試結果來講明這些問題吧,如下結果基於mysql的版本是 5.1.53。io


READ UNCOMMITTED

 SessionA                                                                                

 SessionB

ps:從結果可知,在sessionA尚未commit的時候,SessionB就已經能夠讀取到update的數據,儘管沒有commit.這就會致使「髒讀".


READ-COMMITTED


ps:sessionA只有提交以後,sessionB才能夠讀取update的數據,這就避免了'髒讀',可是仍是存在問題,那就是不可重複讀。sessionB在同一個事務中,兩次讀取的數據不一致。


REPEATABLE READ


ps: 經過設置可重複讀隔離級別,解決了同一個事務中屢次讀取數據不一致的問題,

可是仍是存在問題,那就是'幻讀', 舉例說明,事務A在insert以前發現表裏面沒有數據,因而就準備insert數據,與此同時,事務B insert數據到表裏面而且已經commit.

這個時候事務A繼續insert, 若是某個字段有惟一約束,則insert的時候衝突。



SERIALIZABLE


ps:這個就解決了幻讀的問題,可是影響了併發讀寫性能,sessionA得到了共享鎖,sessoinB是掛起的狀態,只有sessionA commit以後,sessionB才能夠update(不超時的前提下)。

相關文章
相關標籤/搜索