1. 程式人生 > >Mysql InnoDB事務的隔離級別

Mysql InnoDB事務的隔離級別

  • MySQL InnoDB事務的隔離級別有四級,預設是“可重複讀”(REPEATABLE READ)。

    • 未提交讀(READUNCOMMITTED)。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料(髒讀);

    • 提交讀(READCOMMITTED)。本事務讀取到的是最新的資料(其他事務提交後的)。問題是,在同一個事務裡,前後兩次相同的SELECT會讀到不同的結果(不重複讀);

    • 可重複讀(REPEATABLEREAD)。在同一個事務裡,SELECT的結果是事務開始時時間點的狀態,因此,同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象(下文解釋);

    • 序列化(SERIALIZABLE)。讀操作會隱式獲取共享鎖,可以保證不同事務間的互斥。

      四個級別逐漸增強,每個級別解決一個問題。

  • 讀取錯誤的種類:

    • 髒讀。另一個事務修改了資料,但尚未提交,而本事務中的SELECT會讀到這些未被提交的資料;

    • 不重複讀。解決了髒讀後,會遇到,同一個事務執行過程中,另外一個事務提交了新資料,因此本事務先後兩次讀到的資料結果會不一致;

    • 幻讀。解決了不重複讀,保證了同一個事務裡,查詢的結果都是事務開始時的狀態(一致性)。但是,如果另一個事務同時提交了新資料,本事務再更新時,就會“驚奇的”發現了這些新資料,貌似之前讀到的資料是“鬼影”一樣的幻覺。