資料庫事務四大特性及事務隔離級別在mysql中的具體體現
阿新 • • 發佈:2018-12-25
事務的四大特性
- 原子性
指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 - 一致性
指事務必須使資料庫從一個一致性狀態轉換到另一個一致性狀態。拿轉賬來說,不管如何轉賬,錢的總數不變。 - 隔離性
指多個使用者訪問資料庫時,使用者為每個資料庫開啟的事務,不能被其他事務的操作資料干擾,多個併發事務之間要相互隔離。 - 永久性
指一個數據一旦提交,它對資料庫中資料的改變是永久的。
事務的隔離級別
- 髒讀
指一個事務讀取了另一個數據未提交的資料 - 不可重複讀
指一個事務讀取表中同一行的資料,每次讀取到的資料不同。主要是有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時,可以避免不可重複讀:
可以看到,即使右邊的事務提交了,左邊的事務依舊看不到資料變化,只有當左邊的事務也提交,在查詢是才能看到資料變化,這樣就避免了不可重複讀。但此時虛讀仍有可能發生。