mysql事務隔離級別總結

1.事務的基本特性:

    (1)原子性:事務是一組原子性的操作,這一組操作要麼同時成功,要麼同時失敗,不會存在部分性成功和失敗

    (2)一致性:事務執行前和事務執行後,數據都是保持正確的形態

    (3)隔離性:同時時間只允許一個事務對數據進行操作,不允許同時進行,但各個事務都可以正常運行,互不影響

    (4)持久性:一旦事務完成對數據的改變是永久性的,不可更改的

2.查看數據庫事務級別:

    select @@tx_isolation; 默認爲REPEATABLE-READ(可重複讀)

3.事務的隔離級別分爲:讀未提交,讀已提交,可重複讀,串行化

4.事務隔離級別爲read uncommitted(讀未提交):

    (1)可能出現問題:髒讀

    (2)問題描述:事務A讀取了事務B未提交的數據,拿上讀取的數據去做處理,但是它不知道,B由於某些原因,

    進行了事務回滾,A讀到的就會出現髒數據。

    (3)解決辦法:採用讀提交的事務隔離級別

5.事務隔離級別爲read committed(讀已提交):

    (1)雖然解決了髒讀的現象,但是出現的不可重複讀的問題,也就是倆次讀到的數據不一致

    (2)問題描述:事務A開始讀取一條數據,此時事務B正在修改這條數據,但是事務B的事務未提交,

    而由於我們的事務隔離級別是讀已提交,所以事務A不到事務B未提交的數據,但是當事務B提交後,

    事務A再去讀的時候,讀取的就是事務B修改提交後的數據,這樣就造成了倆次讀的數據不一致,即不可重複讀

6.事務隔離級別爲repeatable-read(可重複讀)

    (1)數據庫默認的事務隔離級別

    (2)解決了髒讀的問題,重複讀問題

    (3)可能出現幻讀

    (4)問題描述:事務A讀取一條數據,此時事務B正在修改這條數據,但是事務B未提交,所以事務A不會看到事務B

    的修改但未提交的數據(解決了髒讀問題),當事務B執行commit後,事務A再次讀這條數據時讀到並不是事務B

    修改提交後的數據(解決了重複讀問題),事務B可以看到修改的數據,但當我們在事務A對這條數據進行修改時,

    我們是對事務B修改提交後的數據進行修改的,而不是事務A看到的數據,保證了數據的一致性,還有一種特殊

    情況就是事務B執行了插入一條數據並提交了事務,事務A正在坐sum的時候並沒有把事務B新添加的數據算進去,

    但是當事務A提交sum加上了事務B新添的數據,這就產生了幻讀

    (5)解決辦法:串性化
7.事務隔離界別爲:serializable(串行化)
    (1)解決幻讀現象
    (2)問題描述:事務A在執行查詢時,事務B正在執行插入數據時,因爲表被鎖定了,所以插入失敗,所以可以解決幻讀
    (3)缺點:這樣做會使併發性將低,所以不推薦使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章