鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ PL/SQL事務(wù)
PL/SQL記錄
PL/SQL基本語(yǔ)法
PL/SQL集合
PL/SQL包
PL/SQL關(guān)系運(yùn)算符
PL/SQL比較運(yùn)算符
PL/SQL條件控制
PL/SQL字符串
PL/SQL算術(shù)運(yùn)算符
PL/SQL變量
PL/SQL IF-THEN-ELSIF語(yǔ)句
PL/SQL函數(shù)
PL/SQL異常
PL/SQL FOR循環(huán)語(yǔ)句
PL/SQL日期及時(shí)間
PL/SQL EXIT語(yǔ)句
PL/SQL DBMS輸出
PL/SQL過(guò)程
PL/SQL CONTINUE語(yǔ)句
PL/SQL數(shù)組
PL/SQL嵌套IF-THEN-ELSE語(yǔ)句
PL/SQL事務(wù)
PL/SQL CASE語(yǔ)句
PL/SQL IF-THEN語(yǔ)句
PL/SQL GOTO語(yǔ)句
PL/SQL運(yùn)算符優(yōu)先級(jí)
PL/SQL觸發(fā)器
PL/SQL運(yùn)算符
PL/SQL教程
PL/SQL WHILE循環(huán)語(yǔ)句
PL/SQL面向?qū)ο?/span>
PL/SQL循環(huán)
PL/SQL邏輯運(yùn)算符
PL/SQL IF-THEN-ELSE語(yǔ)句
PL/SQL數(shù)據(jù)類(lèi)型
PL/SQL環(huán)境安裝設(shè)置
PL/SQL游標(biāo)
PL/SQL基本循環(huán)語(yǔ)句
PL/SQL搜索CASE語(yǔ)句
PL/SQL常量和文字
PL/SQL嵌套循環(huán)

PL/SQL事務(wù)

數(shù)據(jù)庫(kù)事務(wù)是一個(gè)工作的原子單元,其可以由一個(gè)或多個(gè)相關(guān)的SQL語(yǔ)句組成。所謂的原子性就是數(shù)據(jù)庫(kù)的修改所帶來(lái)的構(gòu)成事務(wù)的SQL語(yǔ)句可以集體被提交,即永久到數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)中(撤消)回滾。

一個(gè)成功執(zhí)行的SQL語(yǔ)句和提交的事務(wù)不一樣。即使一個(gè)SQL語(yǔ)句執(zhí)行成功,除非包含該語(yǔ)句的事務(wù)被提交,但也可以回滾和聲明(S)的所有更改可以撤消。

開(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í)行。

  • 用戶(hù)從數(shù)據(jù)庫(kù)斷開(kāi)。

  • 從SQL* PLUS用戶(hù)退出通過(guò)發(fā)出EXIT指令,COMMIT自動(dòng)執(zhí)行。

  • SQL* Plus異常終止,自動(dòng)執(zhí)行ROLLBACK。

  • 一個(gè)DML語(yǔ)句失敗; 在這種情況下自動(dòng)執(zhí)行撤消DML語(yǔ)句ROLLBACK。

提交事務(wù)

事務(wù)是通過(guò)發(fā)出SQL命令COMMIT永久生效。COMMIT命令的一般語(yǔ)法是:

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

回滾事務(wù)

對(duì)數(shù)據(jù)庫(kù)所做的不提交更改可以使用ROLLBACK命令撤消。

ROLLBACK命令的一般語(yǔ)法是:

ROLLBACK [TO SAVEPOINT < saveyiibai_name>];

當(dāng)一個(gè)事務(wù)因一些前所未有的情況中止,如系統(tǒng)故障,則整個(gè)事務(wù)由于提交自動(dòng)回滾。如果不使用保存點(diǎn),然后簡(jiǎn)單地使用下面的語(yǔ)句來(lái)回滾所有的變化:

ROLLBACK;

保存點(diǎn)

保存點(diǎn)是某種標(biāo)志,幫助分裂一個(gè)長(zhǎng)事務(wù)分成更小的單位設(shè)置了一些檢查點(diǎn)。由一個(gè)長(zhǎng)事務(wù)中設(shè)置保存點(diǎn),可以根據(jù)需要回滾到一個(gè)檢查點(diǎn)。這是通過(guò)發(fā)出SAVEPOINT命令來(lái)完成。  

保存點(diǎn)命令的一般語(yǔ)法是:

SAVEPOINT < saveyiibai_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;

在這里,ROLLBACK TO sav1; 聲明回滾變化到一點(diǎn),在那里標(biāo)志著保存點(diǎn)sav1,之后將開(kāi)始新的變化。

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

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

SET AUTOCOMMIT ON;

可以關(guān)閉使用以下命令自動(dòng)提交模式:

SET AUTOCOMMIT OFF;