事務(wù)就是對(duì)數(shù)據(jù)庫(kù)執(zhí)行的工作單元。事務(wù)是完成邏輯順序的工作,無(wú)論是在手動(dòng)方式由用戶或者自動(dòng)地通過(guò)某種數(shù)據(jù)庫(kù)程序的序列的單元。
事務(wù)是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)更改傳輸。例如,如果創(chuàng)建一個(gè)記錄或更新記錄或刪除記錄在表上,那么在這個(gè)表上可進(jìn)行事務(wù)。重要的是事務(wù)控制,以確保數(shù)據(jù)的完整性和處理數(shù)據(jù)庫(kù)錯(cuò)誤。
實(shí)際上,將很多SQL查詢集到一個(gè)組,將執(zhí)行所有這些一起作為事務(wù)的一部分。
事務(wù)具有以下四個(gè)標(biāo)準(zhǔn)屬性,通常由首字母縮寫ACID簡(jiǎn)稱:
原子: 確保工作單元中的所有操作都成功完成; 否則,該事務(wù)被中止的故障點(diǎn),操作回滾到操作之前的狀態(tài)。
一致性: 確保數(shù)據(jù)庫(kù)正確后成功提交事務(wù)更改狀態(tài)。
隔離: 事務(wù)操作彼此獨(dú)立和透明。
持久性: 可確保提交的事務(wù)的結(jié)果或仍然存在系統(tǒng)故障的情況下的作用。
用來(lái)控制事務(wù)有如下命令:
COMMIT: 保存更改。
ROLLBACK: 回滾更改。
SAVEPOINT: 回滾事務(wù)組創(chuàng)建點(diǎn)
SET TRANSACTION: 事務(wù)放置的名稱。
事務(wù)控制指令只能用DML命令使用INSERT,UPDATE和DELETE只。它們不能在創(chuàng)建表或刪除它們,因?yàn)檫@些操作都是自動(dòng)提交到數(shù)據(jù)庫(kù)中。
COMMIT命令是用于保存由事務(wù)引用的數(shù)據(jù)庫(kù)改變的事務(wù)命令。
COMMIT命令保存所有事務(wù)在數(shù)據(jù)庫(kù)自上次COMMIT或ROLLBACK命令。
COMMIT命令的語(yǔ)法如下:
COMMIT;
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
以下會(huì)從表中刪除age = 25的記錄,然后提交更改在數(shù)據(jù)庫(kù)中的例子。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> COMMIT;
作為結(jié)果,表2中行數(shù)據(jù)會(huì)被刪除,SELECT語(yǔ)句將產(chǎn)生以下結(jié)果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
ROLLBACK命令是用來(lái)撤消尚未被保存到數(shù)據(jù)庫(kù)事務(wù)的事務(wù)命令。
ROLLBACK命令只能撤消事務(wù),因?yàn)榘l(fā)出的最后一個(gè)COMMIT或ROLLBACK命令。
ROLLBACK命令的語(yǔ)法如下:
ROLLBACK;
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
下面是示例,將刪除表中age = 25 的記錄,然后回滾改變?cè)跀?shù)據(jù)庫(kù)中。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> ROLLBACK;
其結(jié)果是,刪除操作不會(huì)影響表中數(shù)據(jù),使用SELECT語(yǔ)句將產(chǎn)生以下結(jié)果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
保存點(diǎn)SAVEPOINT是,可以回滾事務(wù)到某一事務(wù)節(jié)點(diǎn),而不回滾整個(gè)事務(wù)。
SAVEPOINT命令的語(yǔ)法如下:
SAVEPOINT SAVEPOINT_NAME;
該命令只有在創(chuàng)建中的事務(wù)的SAVEPOINT語(yǔ)句中使用。ROLLBACK命令用來(lái)取消一組事務(wù)。
回滾到SAVEPOINT的語(yǔ)法如下:
ROLLBACK TO SAVEPOINT_NAME;
以下是打算從CUSTOMERS表中刪除這三個(gè)不同的記錄的一個(gè)例子。在每個(gè)刪除之前創(chuàng)建的保存點(diǎn)SAVEPOINT, 這樣就可以回滾到任何SAVEPOINT,并隨時(shí)在適當(dāng)時(shí)將數(shù)據(jù)返回到其原始狀態(tài):
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
現(xiàn)在,這里是一系列操作:
SQL> SAVEPOINT SP1; Saveyiibai created. SQL> DELETE FROM CUSTOMERS WHERE ID=1; 1 row deleted. SQL> SAVEPOINT SP2; Saveyiibai created. SQL> DELETE FROM CUSTOMERS WHERE ID=2; 1 row deleted. SQL> SAVEPOINT SP3; Saveyiibai created. SQL> DELETE FROM CUSTOMERS WHERE ID=3; 1 row deleted.
現(xiàn)在,這三個(gè)刪除已經(jīng)發(fā)生,假設(shè)你要改變主意,決定回滾到標(biāo)識(shí)為SP2的SAVEPOINT。 由于SP2在之后第一個(gè)刪除被創(chuàng)建,最后兩個(gè)刪除都被撤消:
SQL> ROLLBACK TO SP2; Rollback complete.
請(qǐng)注意,只有第一個(gè)刪除發(fā)生,因?yàn)樗貪L到SP2:
SQL> SELECT * FROM CUSTOMERS; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+ 6 rows selected.
RELEASE SAVEPOINT命令用于刪除已經(jīng)創(chuàng)建的一個(gè)SAVEPOINT。
RELEASE SAVEPOINT的語(yǔ)法如下:
RELEASE SAVEPOINT SAVEPOINT_NAME;
一旦保存點(diǎn)已被釋放,使用ROLLBACK命令不能再撤消自SAVEPOINT進(jìn)行事務(wù)。
SET TRANSACTION命令可以被用來(lái)啟動(dòng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)。該命令用于指定隨后的事務(wù)特性。
例如,可以指定一個(gè)事務(wù)是只讀的,或讀寫。
SET TRANSACTION的語(yǔ)法如下:
SET TRANSACTION [ READ WRITE | READ ONLY ];