
- JDBC 教程
- JDBC - 首頁
- JDBC - 簡介
- JDBC - SQL 語法
- JDBC - 環境配置
- JDBC - 示例程式碼
- JDBC - 驅動程式型別
- JDBC - 連線
- JDBC - 語句
- JDBC - 結果集
- JDBC - 資料型別
- JDBC - 事務
- JDBC - 異常
- JDBC - 批次處理
- JDBC - 儲存過程
- JDBC - 資料流
- JDBC - RowSet
- JDBC - 複製資料庫
- JDBC - ACID特性
- JDBC - 連線池
- JDBC 示例
- JDBC - 建立資料庫
- JDBC - 選擇資料庫
- JDBC - 刪除資料庫
- JDBC - 建立表
- JDBC - 刪除表
- JDBC - 插入記錄
- JDBC - 查詢記錄
- JDBC - 更新記錄
- JDBC - 刪除記錄
- JDBC - WHERE 子句
- JDBC - LIKE 子句
- JDBC - 資料排序
- JDBC 有用資源
- JDBC - 問答
- JDBC - 快速指南
- JDBC - 有用資源
- JDBC - 討論
- 有用 - Java 教程
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。
廣告