SQL - 事務



SQL 事務

事務是在資料庫上執行的一個工作單元或序列。事務以邏輯順序完成,無論是使用者手動執行,還是由某種資料庫程式自動執行。

事務是對資料庫進行一個或多個更改的傳播。例如,如果您正在建立、更新或刪除表中的記錄,則您正在對該表執行事務。控制這些事務非常重要,以確保資料完整性並處理資料庫錯誤。

實際上,您會將許多 SQL 查詢組合到一個組中,並將它們一起執行作為事務的一部分。

事務的特性

事務具有以下四個標準屬性,通常用首字母縮寫詞 **ACID** 來表示。

  • **原子性** - 確保工作單元中的所有操作都成功完成。否則,事務在故障點中止,所有先前操作都回滾到其先前狀態。

  • **一致性** - 確保資料庫在成功提交的事務後正確更改狀態。

  • **隔離性** - 使事務能夠獨立於彼此並且對彼此透明地執行。

  • **永續性** - 確保已提交事務的結果或效果在系統故障的情況下仍然存在。

事務控制命令

事務控制命令僅與 **DML 命令** 一起使用,例如 - INSERT、UPDATE 和 DELETE。在建立或刪除表時不能使用它們,因為這些操作會自動提交到資料庫。以下命令用於控制事務。

  • **COMMIT** - 儲存更改。

  • **ROLLBACK** - 回滾更改。

  • **SAVEPOINT** - 在事務組中建立回滾點。

  • **SET TRANSACTION** - 為事務命名。

COMMIT 命令

COMMIT 命令是用於儲存事務呼叫的更改的事務命令。它儲存自上次 COMMIT 或 ROLLBACK 以來對資料庫進行的所有事務。

COMMIT 命令的語法如下所示。

COMMIT;

示例

首先,讓我們使用以下查詢建立一個名為 CUSTOMERS 的表:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

我們將一些記錄插入到上面建立的表中:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

表將如下建立:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

以下查詢將刪除表中年齡為 25 的記錄,然後提交資料庫中的更改。

DELETE FROM CUSTOMERS WHERE AGE = 25;
COMMIT;

驗證

表中的兩行將被刪除,如果您使用 SELECT 語句驗證 CUSTOMERS 表的內容,如下所示:

SELECT * FROM CUSTOMERS;

表將顯示如下:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
3 Kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

ROLLBACK 命令

ROLLBACK 命令是用於撤消尚未儲存到資料庫的事務的事務命令。此命令只能撤消自上次 COMMIT 或 ROLLBACK 以來進行的事務。

ROLLBACK 命令的語法如下:

ROLLBACK;

示例

假設 CUSTOMERS 表具有以下記錄:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

以下查詢將刪除表中 AGE 值為 25 的記錄,然後回滾資料庫中的更改。

DELETE FROM CUSTOMERS WHERE AGE = 25;
ROLLBACK;

驗證

刪除操作不會影響表,SELECT 語句將產生以下結果。

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

SAVEPOINT 命令

SAVEPOINT 是事務中的邏輯回滾點。

通常,當您執行 ROLLBACK 命令時,它會撤消直到上次 COMMIT 的更改。但是,如果您建立儲存點,您可以將事務部分回滾到這些點。您可以在兩次提交之間建立多個儲存點。

在事務中建立 SAVEPOINT 的語法如下所示。

SAVEPOINT savepoint_name;

然後,要回滾到建立的 SAVEPOINT,您可以使用以下語法:

ROLLBACK TO savepoint_name;

示例

以下是一個示例,您計劃從 CUSTOMERS 表中刪除三條不同的記錄。您希望在每次刪除之前建立一個 SAVEPOINT,以便您可以隨時回滾到任何 SAVEPOINT 以將適當的資料返回到其原始狀態。

假設 CUSTOMERS 表具有以下記錄。

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

以下程式碼塊包含一系列操作。

SAVEPOINT SP1;
Query OK, 0 rows affected (0.00 sec)

DELETE FROM CUSTOMERS WHERE ID=1;
Query OK, 1 row affected (0.01 sec)

SAVEPOINT SP2;
Query OK, 0 rows affected (0.00 sec)

DELETE FROM CUSTOMERS WHERE ID=2;
Query OK, 0 rows affected (0.00 sec)

SAVEPOINT SP3;
Query OK, 0 rows affected (0.00 sec)

DELETE FROM CUSTOMERS WHERE ID=3;
Query OK, 1 row affected (0.01 sec)

現在已經進行了三次刪除,假設您改變了主意,並決定回滾到您標識為 SP2 的 SAVEPOINT。因為 SP2 是在第一次刪除後建立的,所以最後兩次刪除被撤消了:

ROLLBACK TO SP2;

驗證

如果您顯示 CUSTOMERS 表,您可以注意到只有第一次刪除發生了,因為您回滾到了 SP2。

ID 姓名 年齡 地址 薪水
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

RELEASE SAVEPOINT 命令

RELEASE SAVEPOINT 命令用於刪除現有的 SAVEPOINT。

RELEASE SAVEPOINT 命令的語法如下所示。

RELEASE SAVEPOINT SAVEPOINT_NAME;

釋放 SAVEPOINT 後,您將無法再使用 ROLLBACK 命令撤消自上次 SAVEPOINT 以來執行的事務。

SET TRANSACTION 命令

SET TRANSACTION 命令可用於啟動資料庫事務。此命令用於指定後續事務的特性。例如,您可以指定事務為只讀或讀寫。

語法

SET TRANSACTION 命令的語法如下所示。

SET TRANSACTION [ READ WRITE | READ ONLY ];
廣告