MySQL 的四種事務隔離級別
MySQL資料庫提供了四種事務隔離級別:
- READ_UNCOMMITTED - 未提交讀
- READ_COMMITTED - 提交讀
- REPEATABLE_READ - 可重複讀
- SERIALIZABLE - 序列讀
什麼是事務
事務指的是滿足 ACID 特性的一組操作,可以通過 Commit 提交一個事務,也可以使用 Rollback 進行回滾。
事務的ACID四大特性
原子性(Atomicity)
事務是不可分割最小單元,事務內所有操作要麼全部成功提交,要麼全部失敗回滾。
回滾可以用回滾日誌來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。
隔離性
一個事務所做的修改在提交以前,對其它事務是不可見的。
一致性
資料庫在事務執行前後都保持一致性狀態。 在一致性狀態下,所有事務對一個數據的讀取結果都是相同的。
永續性
事務一旦提交,其所做的修改將會永久儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。
使用重做日誌來保證永續性
只有滿足一致性,事務的執行結果才是正確的。 在無併發的情況下,事務序列執行,隔離性一定能夠滿足。此時只要能滿足原子性,就一定能滿足一致性。 在併發的情況下,多個事務並行執行,事務不僅要滿足原子性,還需要滿足隔離性,才能滿足一致性。 事務滿足永續性是為了能應對資料庫崩潰的情況。
併發一致性問題
在併發環境下,事務的隔離性很難保證,因此會出現很多併發一致性問題
丟失修改
兩個事務 A 和 B 都對一個數據進行修改,A 先修改,B 後修改,B 的修改覆蓋了A 的需改
髒讀
事務 A 修改了一個數據未提交,事務 B 讀取了這個資料,如果事務 A 回滾這次修改,那麼事務 B 讀到的就是髒資料。
不可重複讀
事務 A 讀取一個數據,事務 B 修改了這個資料。如果事務 A 再次讀取這個資料會導致兩次讀取結果不一致。
幻讀
事務 A 讀取某個範圍的資料,事務 B 在這個範圍內插入一條資料。如果事務 A 再次讀取這個範圍的資料會導致兩次讀取結果不一致。
事務隔離級別
未提交讀
一個事務所做的修改即使沒有提交,對其他事務也是可見的。
提交讀
一個事務所做的修改在提交之前對其他事務是不可見的。
可重複讀
保證一個事務內多次讀取同樣資料的結果是一致的。
可序列讀
強制事務序列執行。