1. 程式人生 > >資料庫事務的特點與隔離級別

資料庫事務的特點與隔離級別

事務的四個特點

百度百科:資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的ACID(原子性、一致性、隔離性和永續性)屬性。

1.原子性(Atomicity):
事務中的一組操作是不可分割的,要麼全部成功,要麼全部撤銷。

2.一致性(Consistency):
幾個事務併發執行,其執行結果必須和按照某種順序序列執行這些事務的效果是一樣的。即事務執行前後,資料庫的資料要保持一致性。

3.隔離性(Isolation):
事務的執行不受其它事務的影響,併發執行的幾個事務,互不影響。事務執行的中間結果對其它事務必須是透明的(不可見)。

4.永續性(Durability):
對於任意已提交事務,系統事務對資料庫的改變不被丟失,即使資料庫出現故障。

事務的隔離級別

資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。

√: 可能出現 ×: 不會出現
事務隔離級別

READ_UNCOMMITED 的原理:

  • 事務對當前被讀取的資料不加鎖;
  • 事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放。

表現:

  • 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,能讀到事務2對該記錄的修改版本,即使該修改尚未被提交。
  • 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。

READ_COMMITED 的原理:

  • 事務對當前被讀取的資料加 行級共享鎖(當讀到時才加鎖),一旦讀完該行,立即釋放該行級共享鎖;
  • 事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放。

表現:

  • 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,讀到的只能是事務2對其更新前的版本,要不就是事務2提交後的版本。
  • 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。

REPEATABLE READ 的原理:

  • 事務在讀取某資料的瞬間(就是開始讀取的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放;
  • 事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放。

表現:

  • 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,讀到的仍然是第一次讀取的那個版本。
  • 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。

SERIALIZABLE 的原理:

  • 事務在讀取資料時,必須先對其加 表級共享鎖 ,直到事務結束才釋放;
  • 事務在更新資料時,必須先對其加 表級排他鎖 ,直到事務結束才釋放。

表現:

  • 事務1正在讀取A表中的記錄時,則事務2也能讀取A表,但不能對A表做更新、新增、刪除,直到事務1結束。
  • 事務1正在更新A表中的記錄時,則事務2不能讀取A表的任意記錄,更不可能對A表做更新、新增、刪除,直到事務1結束。