開始/結(jié)束事務(wù)
事務(wù)都有開始和結(jié)束。事務(wù)開始時有下列事件之一:
- 連接到數(shù)據(jù)庫后執(zhí)行的第一個SQL語句。
- 在事務(wù)完成之后發(fā)出每一個新的SQL語句完成。
事務(wù)結(jié)束時的下列事件之一發(fā)生:
- COMMIT或發(fā)出ROLLBACK語句。
- DDL語句,如CREATE TABLE語句,則發(fā)出;因為在這種情況下,COMMIT被自動執(zhí)行。
- 一個DCL語句,比如一個GRANT語句發(fā)出; 因為在這種情況下,COMMIT被自動執(zhí)行。
- 用戶從數(shù)據(jù)庫斷開。
- 從SQL* PLUS用戶退出通過發(fā)出EXIT指令,COMMIT自動執(zhí)行。
- SQL* Plus異常終止,自動執(zhí)行ROLLBACK。
- 一個DML語句失敗; 在這種情況下自動執(zhí)行撤消DML語句ROLLBACK。
當(dāng)執(zhí)行一組 SQL 語句的時候,Oracle默認(rèn)幫我們開啟一個事務(wù)。我們也可以通過 SET TRANSACTION 語句手動開啟一個事務(wù)。
??Oracle默認(rèn)的隔離級別是read committed。
提交事務(wù)
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 );
COMMIT;
回滾事務(wù)
ROLLBACK命令的一般語法是:
ROLLBACK [TO SAVEPOINT <savepoint_name>];
- 使用TO SAVEPOINT參數(shù)可以回滾到指定的回滾點
- 直接ROLLBACK則整個事務(wù)都會回滾
保存點
??保存點是某種標(biāo)志,幫助分裂一個長事務(wù)分成更小的單位,并設(shè)置了一些檢查點。在一個長事務(wù)中設(shè)置保存點,可以根據(jù)需要回滾到一個檢查點。
保存點命令的一般語法是:
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;
自動事務(wù)控制
①自動開啟事務(wù)
SET TRANSACTION [事務(wù)類型|ISOLATION LEVEL 事務(wù)隔離級別] NAME 事務(wù)名稱;
- 事務(wù)類型有:READ WRITE(讀寫事務(wù))、READ ONLY(只讀事務(wù))
【示例】
BEGIN
-- 手動開啟事務(wù) tran
SET TRANSACTION NAME 'tran';
--SET TRANSACTION READ WRITE NAME 'tran'; -- 這條語句和上面的語句完全相同,表明它是一個讀寫事務(wù)
INSERT INTO TEST VALUES ('Scott');
-- 提交事務(wù)
COMMIT;
END;
/
②自動執(zhí)行事務(wù)提交
??要在每一個insert,update或detele命令執(zhí)行后自動執(zhí)行commit,可以設(shè)置autocommit環(huán)境變量:
#on為打開自動commit,off為關(guān)閉自動commit
set autocommit on;