PL/SQL事務

數據庫事務是一個工作的原子單元,其可以由一個或多個相關的SQL語句組成。所謂的原子性就是數據庫的修改所帶來的構成事務的SQL語句可以集體被提交,即永久到數據庫或從數據庫中(撤消)回滾。

一個成功執行的SQL語句和提交的事務不一樣。即使一個SQL語句執行成功,除非包含該語句的事務被提交,但也可以回滾和聲明(S)的所有更改可以撤消。

開始/結束事務

事務都有開始和結束。事務開始時有下列事件之一:

  • 連接到數據庫後執行的第一個SQL語句。

  • 在事務完成之後發出每一個新的SQL語句完成。

事務結束時的下列事件之一發生:

  • COMMIT或發出ROLLBACK語句。

  • DDL語句,如CREATE TABLE語句,則發出;因爲在這種情況下,COMMIT被自動執行。

  • 一個DCL語句,比如一個GRANT語句發出; 因爲在這種情況下,COMMIT被自動執行。

  • 用戶從數據庫斷開。

  • 從SQL* PLUS用戶退出通過發出EXIT指令,COMMIT自動執行。

  • SQL* Plus異常終止,自動執行ROLLBACK。

  • 一個DML語句失敗; 在這種情況下自動執行撤消DML語句ROLLBACK。

提交事務

事務是通過發出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命令撤消。

ROLLBACK命令的一般語法是:

ROLLBACK [TO SAVEPOINT < saveyiibai_name>];

當一個事務因一些前所未有的情況中止,如系統故障,則整個事務由於提交自動回滾。如果不使用保存點,然後簡單地使用下面的語句來回滾所有的變化:

ROLLBACK;

保存點

保存點是某種標誌,幫助分裂一個長事務分成更小的單位設置了一些檢查點。由一個長事務中設置保存點,可以根據需要回滾到一個檢查點。這是通過發出SAVEPOINT命令來完成。  

保存點命令的一般語法是:

SAVEPOINT < saveyiibai_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,之後將開始新的變化。

自動事務控制

要執行一個自動COMMIT在每一個INSERT,UPDATE或DELETE命令執行時,可以設置AUTOCOMMIT環境變量:

SET AUTOCOMMIT ON;

可以關閉使用以下命令自動提交模式:

SET AUTOCOMMIT OFF;