PL/SQL事務(wù)

開(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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容