JDBC - 事務的ACID特性



什麼是事務?

事務是訪問並更新資料庫內容的單個邏輯操作單元。

事務的ACID特性

為了保持資料庫一致性,事務還必須保持某些特性,這些特性稱為ACID特性A代表原子性,C代表一致性,I代表隔離性,D代表永續性。

  • 原子性 − 事務涉及按順序執行的一組操作。原子性表示這組操作要麼全部成功,要麼全部失敗。

  • 一致性 − 此特性確保只有一致的資料新增到資料庫。如果發生任何錯誤,資料庫將恢復到初始狀態。

  • 隔離性 − 事務必須彼此隔離,否則資料可能會損壞。隔離級別可以是讀未提交、讀已提交、可重複讀和可序列化。這些將在下一節中描述。

  • 永續性 − 此特性確保已完成的事務將適當地持久化資料,即使在伺服器故障/系統崩潰的情況下也是如此。

髒讀、不可重複讀、幻讀

在理解隔離性之前,讓我們先了解以下基本概念:

  • 髒讀 − 使用者A向表中插入一行。使用者B選擇該行。使用者A取消事務。現在,B已經對該行進行了更改,但是該行不再存在於資料庫中了。

  • 不可重複讀 − 使用者A讀取一行。使用者B更新該行。使用者A再次讀取該行,並看到更新後的結果。

  • 幻讀 − 使用者A讀取表中滿足SQL中WHERE條件的所有行。使用者B向滿足WHERE條件的同一查詢中新增一行。使用者A再次執行SELECT操作,並找到新增的行。

隔離級別

以下是java.sql包中存在的五個主要隔離級別。

序號 隔離級別 描述
1 TRANSACTION_NONE 不支援事務。
2 TRANSACTION_READ_UNCOMMITTED 未儲存的資料對事務可見。所有資料不一致性都是可能的。
3 TRANSACTION_READ_COMMITTED 防止髒讀。對事務的所有更改只有在事務提交後才可見。
4 TRANSACTION_REPEATABLE_READ 防止髒讀、不可重複讀。第二個事務不能讀取、更新或刪除第一個事務選擇的行。不防止幻讀。
5 TRANSACTION_SERIALIZABLE 最嚴格的隔離級別。防止髒讀、不可重複讀、幻讀。

上述隔離級別可以透過java.sql包中的Connection物件的setIsolationLevel方法設定。例如,

Connection conn = DriverManager.getConnection("jdbc:mysql:///TUTORIALSPOINT", "user", "password");
conn.setIsolationLevel(Connection.TRANSACTION_READ_COMMITTED);

在MySQL中設定隔離級別

隔離級別也可以在資料庫中設定。對於MySQL:

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

其他允許的值如下:

  • READ COMMITTED

  • READ UNCOMMITTED

預設隔離級別為REPEATABLE READ

廣告