在數據庫中,事務是由一個或多個相關SQL語句組成的原子工作單元。之所以這麼叫,是因為數據庫是由SQL語句修改的,因為這構成了一個可以共同提交的事務,可以使其永久保存到數據庫中,也可以從數據庫中回滾。當SQL語句執行成功且提交的事務不相同時。當SQL語句成功執行時,可以回滾事務,並且可以撤消由語句所做的更改,除非事務被稱為已提交。
開始和結束事務
據說所有的事務都有開始和結束。當發生以下事件之一時,事務開始:
- 第一條SQL語句是在連接到數據庫之後執行的。
- 在事務完成之後,每一條新的SQL語句都會被發出。
當發生以下事件之一時,事務結束:
- 當發出提交或回滾語句時。
- 發出DDL語句,如CREATE TABLE語句,因為在這種情況下會自動執行COMMIT。
- 像GRANT語句一樣發出DCL語句,因為在這種情況下會自動執行COMMIT。
- 當用戶從數據庫斷開連接時。
- 當用戶通過發出EXIT命令退出SQL*PLUS時,將自動執行COMMIT。
- SQL*Plus異常終止時,自動執行ROLLBACK操作。
- 當DML語句失敗時,ROLLBACK(在本例中)將自動執行撤銷該DML語句。
提交事務
當我們發出SQL命令COMMIT時,事務可以變成永久的。
語法:提交;示例:INSERT INTO teachers (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'ranjitha', 34, 'bangalore', 2000.00);INSERT INTO teacher (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'sai', 24, 'hyderabad', 3000.00);INSERT INTO teacher (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'shakthi', 32, 'pune', 4500.00);提交;
回滾事務
可以在沒有COMMIT的情況下對數據庫進行更改,可以使用ROLLBACK命令來撤銷COMMIT。
語法:
ROLLBACK [TO SAVEPOINT < savepoint_name>];
當事務由於某些前所未有的情況(例如係統故障)而中止時,自提交以來的整個事務將自動回滾。如果我們不使用保存點,我們可以使用ROLLBACK語句。
回滾;
保存點
據說,這些製造商通過設置一些檢查點,幫助將一個長交易分割成較小的單元。當我們在長事務中設置這個保存點時,如果需要,我們還可以回滾到檢查點。
語法:SAVEPOINT < savepoint_name>;例如:INSERT INTO teachers (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'ranjitha', 34, 'bangalore', 2000.00);INSERT INTO teacher (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'sai', 24, 'hyderabad', 3000.00);INSERT INTO teacher (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'shakthi', 32, 'pune', 4500.00);保存點sav1;更新教師設定工資=工資+1000;回滾到sav1;更新教師工資=工資+1000,id =2;更新教師工資=工資+1000,id =3;提交;
ROLLBACK to sav1語句回滾到我們標記為sav1的保存點之前的所有更改。在此之後,我們將開始進行所有新的改變。
自動事務控製
為了在執行INSERT、UPDATE或delete命令時自動執行COMMIT,可以設置這個AUTOCOMMIT環境變量。
設置自動提交;
關閉自動提交;