1. 程式人生 > >資料庫事務四大特性及事務隔離級別在mysql中的具體體現

資料庫事務四大特性及事務隔離級別在mysql中的具體體現

事務的四大特性

  • 原子性
    指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
  • 一致性
    指事務必須使資料庫從一個一致性狀態轉換到另一個一致性狀態。拿轉賬來說,不管如何轉賬,錢的總數不變。
  • 隔離性
    指多個使用者訪問資料庫時,使用者為每個資料庫開啟的事務,不能被其他事務的操作資料干擾,多個併發事務之間要相互隔離。
  • 永久性
    指一個數據一旦提交,它對資料庫中資料的改變是永久的。

事務的隔離級別

  • 髒讀
    指一個事務讀取了另一個數據未提交的資料
  • 不可重複讀
    指一個事務讀取表中同一行的資料,每次讀取到的資料不同。主要是有update語句引起的,讀取到了另一個事務提交後
    的資料。
  • 虛讀
    指一個事務讀取到了另一個事務插入的資料,主要有insert語句引起。

這三種隔離級別依次提高,但隔離級別並不是越高越好,因為安全性越高,效率也就越低。

mysql中的隔離級別

  • read uncommitted(髒讀、不可重複讀、虛讀都有可能發生)
  • read committed(避免髒讀,不可重複讀、虛讀有可能發生)
  • repeatable read(避免髒讀、不可重複讀,虛讀有可能發生)
  • serializable(避免髒讀、不可重複讀、虛讀)

    檢視mysql的隔離級別:

select @@tx_isolation;

這裡寫圖片描述

設定mysql的隔離級別:

set
transaction isolation level 四個隔離級別

mysql中四種隔離級別的體現:
出現髒讀:
這裡寫圖片描述
左邊的事務設定了隔離級別為髒讀、不可重複讀、虛讀都有可能發生,當右邊的事務執行update語句但沒有提交時,在左邊可以看到資料的改變,當右邊的事務rollback時,左邊的事務又發生變化:
這裡寫圖片描述
這就是發生了髒讀,一個事務讀到了另一個事務沒有提交的資料,如果右邊的事務rollback,左邊的資料讀取到的資料就是無效的資料,所以稱為發生了髒讀。

當設定隔離級別為read committed即可避免髒讀:
這裡寫圖片描述
當右邊的事務沒有提交時,左邊的事務無法讀到改變的資料,只有當右邊的事務提交後,左邊的事務才能看到資料的變化:
這裡寫圖片描述


這種情況也叫發生了不可重複讀,因為左邊事務讀取到的資料發生了變化,剛開始a的money是1000,後面又成了1100。

當設定事務隔離級別為repeatable read時,可以避免不可重複讀:
這裡寫圖片描述
可以看到,即使右邊的事務提交了,左邊的事務依舊看不到資料變化,只有當左邊的事務也提交,在查詢是才能看到資料變化,這樣就避免了不可重複讀。但此時虛讀仍有可能發生。