讀未提交(Read uncommitted),一個事務可以讀取另一個未提交事務的數據,最低級別,任何情況都無法保證。
(1)所有事務都可以看到其他未提交事務的執行結果
(2)本隔離級別很少用於實際應用,因為它的性能也不比其他級別好多少
(3)該級別引發的問題是——臟讀(Dirty Read):讀取到了未提交的數據
讀已提交(Read committed),一個事務要等另一個事務提交后才能讀取數據,可避免臟讀的發生。
(1)這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)
(2)它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變
(3)這種隔離級別出現的問題是——不可重復讀(Nonrepeatable Read):不可重復讀意味着我們在同一個事務中執行完全相同的select語句時可能看到不一樣的結果。
|——>導致這種情況的原因可能有:(1)有一個交叉的事務有新的commit,導致了數據的改變;(2)一個數據庫被多個實例操作時,同一事務的其他實例在該實例處理其間可能會有新的commit
可重復讀(Repeatable read),就是在開始讀取數據(事務開啟)時,不再允許修改操作,可避免臟讀、不可重復讀的發生。
(1)這是MySQL的默認事務隔離級別
(2)它確保同一事務的多個實例在並發讀取數據時,會看到同樣的數據行
(3)此級別可能出現的問題——幻讀(Phantom Read):當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行
(4)InnoDB和Falcon存儲引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題
串行(Serializable),是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。Mysql的默認隔離級別是Repeatable read。
(1)這是最高的隔離級別
(2)它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。
(3)在這個級別,可能導致大量的超時現象和鎖競爭