Mysql InnoDB事務的隔離級別
阿新 • • 發佈:2019-02-08
MySQL InnoDB事務的隔離級別有四級,預設是“可重複讀”(REPEATABLE READ)。
未提交讀(READUNCOMMITTED)。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料(髒讀);
提交讀(READCOMMITTED)。本事務讀取到的是最新的資料(其他事務提交後的)。問題是,在同一個事務裡,前後兩次相同的SELECT會讀到不同的結果(不重複讀);
可重複讀(REPEATABLEREAD)。在同一個事務裡,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象(下文解釋);
序列化(SERIALIZABLE)。讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥。
四個級別逐漸增強,每個級別解決一個問題。
讀取錯誤的種類:
髒讀。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料;
不重複讀。解決了髒讀後,會遇到,同一個事務執行過程中,另外一個事務提交了新資料,因此本事務先後兩次讀到的資料結果會不一致;
幻讀。解決了不重複讀,保證了同一個事務裡,查詢的結果都是事務開始時的狀態(一致性)。但是,如果另一個事務同時提交了新資料,本事務再更新時,就會“驚奇的”發現了這些新資料,貌似之前讀到的資料是“鬼影”一樣的幻覺。