PL/SQL事務


在本章中,我們將討論和學習PL/SQL中的事務。 資料庫事務是由一個或多個相關SQL語句組成的原子工作單元。它被稱為原子操作,因為構成事務的SQL語句帶來的資料庫修改可以共同提交,即永久化到資料庫或從資料庫回滾(復原)。

成功執行的SQL語句和提交的事務不一樣。即使成功執行SQL語句,除非提交包含語句的事務,否則可以回滾該語句,並且可以撤消語句所做的所有更改。

開始和結束事務

事務有開始和結束。當發生以下事件之一時,事務即開始 -

  • 連線到資料庫後執行第一個SQL語句。
  • 在事務完成後發出的每個新的SQL語句。

事務在下列事件之一發生時結束 -

  • 發出了COMMITROLLBACK語句。
  • 發出DDL語句,例如:CREATE TABLE語句; 因為在這種情況下,自動執行COMMIT
  • 發布DCL語句,如:GRANT宣告; 因為在這種情況下,自動執行COMMIT
  • 使用者從資料庫斷開連線。
  • 使用者通過發出EXIT命令從SQL * PLUS退出,COMMIT自動執行。
  • SQL * Plus異常終止,會自動執行ROLLBACK
  • DML語句失敗; 在這種情況下,會自動執行ROLLBACK來撤消該DML語句。

提交事務

通過發出SQL命令COMMIT將事務永久化。COMMIT命令的一般語法是 -

COMMIT;

例如,

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (6, 'Komal', 22, 'MP', 4500.00 ); 

COMMIT;

回滾事務

使用ROLLBACK命令可以復原對不帶COMMIT的資料庫所做的更改。

ROLLBACK命令的一般語法是 -

ROLLBACK [TO SAVEPOINT < savepoint_name>];

當事務由於某種前所未有的情況而中止,如系統故障時,自提交以來整個事務被自動回滾。 如果不使用儲存點(savepoint),那麼只需使用以下語句來回滾所有更改。

ROLLBACK;

儲存點 - Savepoints

儲存點(Savepoints)是有助於通過設定一些檢查點將長事務拆分成更小的單元的標記。通過在長事務中設定儲存點,如果需要,可以回滾到檢查點。這是通過發出SAVEPOINT命令完成的。

SAVEPOINT命令的一般語法是 -

SAVEPOINT < savepoint_name >;

例如,

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 ); 
SAVEPOINT sav1;

UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000; 
ROLLBACK TO sav1;

UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 7; 
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 8; 

COMMIT;

ROLLBACK TO sav1 - 此語句回滾直到儲存點sav1的所有更改。

之後,所做新的改變將重新開始。

自動事務控制

要在執行INSERTUPDATEDELETE命令時自動執行COMMIT,可以將AUTOCOMMIT環境變數設定為 -

SET AUTOCOMMIT ON;

也可以使用以下命令關閉事務自動提交模式 -

SET AUTOCOMMIT OFF;