1. 程式人生 > >PL/SQL事務

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;

示例,

INSERTINTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(1,'Ramesh',32,'Ahmedabad',2000.00);INSERTINTO
CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(2,'Khilan',25,'Delhi',1500.00);INSERTINTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(3,'kaushik',23,'Kota',2000.00);INSERTINTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(4,'Chaitali',25,'Mumbai',6500.00);INSERTINTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(5,'Hardik'
,27,'Bhopal',8500.00);INSERTINTO 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 >;

示例:

INSERTINTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(7,'Rajnish',27,'HP',9500.00);INSERTINTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)VALUES(8,'Riddhi',21,'WB',4500.00);
SAVEPOINT sav1;UPDATE CUSTOMERS
SET SALARY = SALARY +1000;ROLLBACKTO sav1;UPDATE CUSTOMERS
SET SALARY = SALARY +1000WHERE ID =7;UPDATE CUSTOMERS
SET SALARY = SALARY +1000WHERE ID =8;COMMIT;

在這裡,ROLLBACK TO sav1; 宣告回滾變化到一點,在那裡標誌著儲存點sav1,之後將開始新的變化。

自動事務控制

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

SET AUTOCOMMIT ON;

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

SET AUTOCOMMIT OFF;