事務的隔離級別,mysql默認的隔離級別是什么?


讀未提交(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)在這個級別,可能導致大量的超時現象和鎖競爭

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM