PL/SQL 事務(wù)

2021-08-30 15:53 更新

在本章中,我們將討論和學(xué)習(xí)PL/SQL中的事務(wù)。 數(shù)據(jù)庫事務(wù)是由一個(gè)或多個(gè)相關(guān)SQL語句組成的原子工作單元。它被稱為原子操作,因?yàn)闃?gòu)成事務(wù)的SQL語句帶來的數(shù)據(jù)庫修改可以共同提交,即永久化到數(shù)據(jù)庫或從數(shù)據(jù)庫回滾(撤銷)。

成功執(zhí)行的SQL語句和提交的事務(wù)不一樣。即使成功執(zhí)行SQL語句,除非提交包含語句的事務(wù),否則可以回滾該語句,并且可以撤消語句所做的所有更改。

開始和結(jié)束事務(wù)

事務(wù)有開始和結(jié)束。當(dāng)發(fā)生以下事件之一時(shí),事務(wù)即開始 -

  • 連接到數(shù)據(jù)庫后執(zhí)行第一個(gè)SQL語句。
  • 在事務(wù)完成后發(fā)出的每個(gè)新的SQL語句。

事務(wù)在下列事件之一發(fā)生時(shí)結(jié)束 -

  • 發(fā)出了COMMIT或ROLLBACK語句。
  • 發(fā)出DDL語句,例如:CREATE TABLE語句; 因?yàn)樵谶@種情況下,自動(dòng)執(zhí)行COMMIT。
  • 發(fā)布DCL語句,如:GRANT聲明; 因?yàn)樵谶@種情況下,自動(dòng)執(zhí)行COMMIT。
  • 用戶從數(shù)據(jù)庫斷開連接。
  • 用戶通過發(fā)出EXIT命令從SQL * PLUS退出,COMMIT自動(dòng)執(zhí)行。
  • SQL * Plus異常終止,會(huì)自動(dòng)執(zhí)行ROLLBACK。
  • DML語句失敗; 在這種情況下,會(huì)自動(dòng)執(zhí)行ROLLBACK來撤消該DML語句。

提交事務(wù)

通過發(fā)出SQL命令COMMIT將事務(wù)永久化。COMMIT命令的一般語法是 -

COMMIT;
SQL

例如,

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;
SQL

回滾事務(wù)

使用ROLLBACK命令可以撤銷對(duì)不帶COMMIT的數(shù)據(jù)庫所做的更改。

ROLLBACK命令的一般語法是 -

ROLLBACK [TO SAVEPOINT < savepoint_name>];
SQL

當(dāng)事務(wù)由于某種前所未有的情況而中止,如系統(tǒng)故障時(shí),自提交以來整個(gè)事務(wù)被自動(dòng)回滾。 如果不使用保存點(diǎn)(savepoint),那么只需使用以下語句來回滾所有更改。

ROLLBACK;
SQL

保存點(diǎn) - Savepoints

保存點(diǎn)(Savepoints)是有助于通過設(shè)置一些檢查點(diǎn)將長事務(wù)拆分成更小的單元的標(biāo)記。通過在長事務(wù)中設(shè)置保存點(diǎn),如果需要,可以回滾到檢查點(diǎn)。這是通過發(fā)出SAVEPOINT命令完成的。

SAVEPOINT命令的一般語法是 -

SAVEPOINT < savepoint_name >;
SQL

例如,

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;
SQL

ROLLBACK TO sav1 - 此語句回滾直到保存點(diǎn)sav1的所有更改。

之后,所做新的改變將重新開始。

自動(dòng)事務(wù)控制

要在執(zhí)行INSERT,UPDATE或DELETE命令時(shí)自動(dòng)執(zhí)行COMMIT,可以將AUTOCOMMIT環(huán)境變量設(shè)置為 -

SET AUTOCOMMIT ON;
SQL

也可以使用以下命令關(guān)閉事務(wù)自動(dòng)提交模式 -

SET AUTOCOMMIT OFF;

 



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)