SQL事務
事務就是對數據庫執行的工作單元。事務是完成邏輯順序的工作,無論是在手動方式由用戶或者自動地通過某種數據庫程序的序列的單元。
事務是一個或多個數據庫更改傳輸。例如,如果創建一個記錄或更新記錄或刪除記錄在表上,那麼在這個表上可進行事務。重要的是事務控製,以確保數據的完整性和處理數據庫錯誤。
實際上,將很多SQL查詢集到一個組,將執行所有這些一起作為事務的一部分。
事務特性:
事務具有以下四個標準屬性,通常由首字母縮寫ACID簡稱:
-
原子: 確保工作單元中的所有操作都成功完成; 否則,該事務被中止的故障點,操作回滾到操作之前的狀態。
-
一致性: 確保數據庫正確後成功提交事務更改狀態。
-
隔離: 事務操作彼此獨立和透明。
-
持久性: 可確保提交的事務的結果或仍然存在係統故障的情況下的作用。
事務控製:
用來控製事務有如下命令:
-
COMMIT: 保存更改。
-
ROLLBACK: 回滾更改。
-
SAVEPOINT: 回滾事務組創建點
-
SET TRANSACTION: 事務放置的名稱。
事務控製指令隻能用DML命令使用INSERT,UPDATE和DELETE隻。它們不能在創建表或刪除它們,因為這些操作都是自動提交到數據庫中。
COMMIT命令:
COMMIT命令是用於保存由事務引用的數據庫改變的事務命令。
COMMIT命令保存所有事務在數據庫自上次COMMIT或ROLLBACK命令。
COMMIT命令的語法如下:
COMMIT;
例子:
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
以下會從表中刪除age = 25的記錄,然後提交更改在數據庫中的例子。
SQL> DELETE FROM CUSTOMERS WHERE AGE = 25; SQL> COMMIT;
作為結果,表2中行數據會被刪除,SELECT語句將產生以下結果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
ROLLBACK命令:
ROLLBACK命令是用來撤消尚未被保存到數據庫事務的事務命令。
ROLLBACK命令隻能撤消事務,因為發出的最後一個COMMIT或ROLLBACK命令。
ROLLBACK命令的語法如下:
ROLLBACK;
例子:
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
下麵是示例,將刪除表中age = 25 的記錄,然後回滾改變在數據庫中。
SQL> DELETE FROM CUSTOMERS WHERE AGE = 25; SQL> ROLLBACK;
其結果是,刪除操作不會影響表中數據,使用SELECT語句將產生以下結果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
SAVEPOINT命令:
保存點SAVEPOINT是,可以回滾事務到某一事務節點,而不回滾整個事務。
SAVEPOINT命令的語法如下:
SAVEPOINT SAVEPOINT_NAME;
該命令隻有在創建中的事務的SAVEPOINT語句中使用。ROLLBACK命令用來取消一組事務。
回滾到SAVEPOINT的語法如下:
ROLLBACK TO SAVEPOINT_NAME;
以下是打算從CUSTOMERS表中刪除這三個不同的記錄的一個例子。在每個刪除之前創建的保存點SAVEPOINT, 這樣就可以回滾到任何SAVEPOINT,並隨時在適當時將數據返回到其原始狀態:
例子:
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
現在,這裡是一係列操作:
SQL> SAVEPOINT SP1; Saveyiibai created. SQL> DELETE FROM CUSTOMERS WHERE ID=1; 1 row deleted. SQL> SAVEPOINT SP2; Saveyiibai created. SQL> DELETE FROM CUSTOMERS WHERE ID=2; 1 row deleted. SQL> SAVEPOINT SP3; Saveyiibai created. SQL> DELETE FROM CUSTOMERS WHERE ID=3; 1 row deleted.
現在,這三個刪除已經發生,假設你要改變主意,決定回滾到標識為SP2的SAVEPOINT。 由於SP2在之後第一個刪除被創建,最後兩個刪除都被撤消:
SQL> ROLLBACK TO SP2; Rollback complete.
請注意,隻有第一個刪除發生,因為它回滾到SP2:
SQL> SELECT * FROM CUSTOMERS; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 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 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+ 6 rows selected.
RELEASE SAVEPOINT命令:
RELEASE SAVEPOINT命令用於刪除已經創建的一個SAVEPOINT。
RELEASE SAVEPOINT的語法如下:
RELEASE SAVEPOINT SAVEPOINT_NAME;
一旦保存點已被釋放,使用ROLLBACK命令不能再撤消自SAVEPOINT進行事務。
SET TRANSACTION 命令:
SET TRANSACTION命令可以被用來啟動一個數據庫事務。該命令用於指定隨後的事務特性。
例如,可以指定一個事務是隻讀的,或讀寫。
SET TRANSACTION的語法如下:
SET TRANSACTION [ READ WRITE | READ ONLY ];