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