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;

上一篇: PL/SQL集合 下一篇: PL/SQL日期及時間