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;