數(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)的所有更改可以撤消。
事務(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ù)是通過(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;
對(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)是某種標(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)始新的變化。
要執(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;