1. 程式人生 > >MySQL 的四種事務隔離級別

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 再次讀取這個範圍的資料會導致兩次讀取結果不一致。

事務隔離級別

未提交讀

一個事務所做的修改即使沒有提交,對其他事務也是可見的。

提交讀

一個事務所做的修改在提交之前對其他事務是不可見的。

可重複讀

保證一個事務內多次讀取同樣資料的結果是一致的。

可序列讀

強制事務序列執行。