事務(wù)就是對數(shù)據(jù)庫執(zhí)行的工作單元。事務(wù)是完成邏輯順序的工作,無論是在手動方式由用戶或者自動地通過某種數(shù)據(jù)庫程序的序列的單元。
事務(wù)是一個或多個數(shù)據(jù)庫更改傳輸。例如,如果創(chuàng)建一個記錄或更新記錄或刪除記錄在表上,那么在這個表上可進(jìn)行事務(wù)。重要的是事務(wù)控制,以確保數(shù)據(jù)的完整性和處理數(shù)據(jù)庫錯誤。
實際上,將很多SQL查詢集到一個組,將執(zhí)行所有這些一起作為事務(wù)的一部分。
事務(wù)具有以下四個標(biāo)準(zhǔn)屬性,通常由首字母縮寫ACID簡稱:
原子: 確保工作單元中的所有操作都成功完成; 否則,該事務(wù)被中止的故障點,操作回滾到操作之前的狀態(tài)。
一致性: 確保數(shù)據(jù)庫正確后成功提交事務(wù)更改狀態(tài)。
隔離: 事務(wù)操作彼此獨立和透明。
持久性: 可確保提交的事務(wù)的結(jié)果或仍然存在系統(tǒng)故障的情況下的作用。
用來控制事務(wù)有如下命令:
COMMIT: 保存更改。
ROLLBACK: 回滾更改。
SAVEPOINT: 回滾事務(wù)組創(chuàng)建點
SET TRANSACTION: 事務(wù)放置的名稱。
事務(wù)控制指令只能用DML命令使用INSERT,UPDATE和DELETE只。它們不能在創(chuàng)建表或刪除它們,因為這些操作都是自動提交到數(shù)據(jù)庫中。
COMMIT命令是用于保存由事務(wù)引用的數(shù)據(jù)庫改變的事務(wù)命令。
COMMIT命令保存所有事務(wù)在數(shù)據(jù)庫自上次COMMIT或ROLLBACK命令。
COMMIT命令的語法如下:
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 | +----+----------+-----+-----------+----------+
以下會從表中刪除age = 25的記錄,然后提交更改在數(shù)據(jù)庫中的例子。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> COMMIT;
作為結(jié)果,表2中行數(shù)據(jù)會被刪除,SELECT語句將產(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命令是用來撤消尚未被保存到數(shù)據(jù)庫事務(wù)的事務(wù)命令。
ROLLBACK命令只能撤消事務(wù),因為發(fā)出的最后一個COMMIT或ROLLBACK命令。
ROLLBACK命令的語法如下:
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 的記錄,然后回滾改變在數(shù)據(jù)庫中。
SQL> DELETE FROM CUSTOMERS
WHERE AGE = 25;
SQL> ROLLBACK;
其結(jié)果是,刪除操作不會影響表中數(shù)據(jù),使用SELECT語句將產(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 | +----+----------+-----+-----------+----------+
保存點SAVEPOINT是,可以回滾事務(wù)到某一事務(wù)節(jié)點,而不回滾整個事務(wù)。
SAVEPOINT命令的語法如下:
SAVEPOINT SAVEPOINT_NAME;
該命令只有在創(chuàng)建中的事務(wù)的SAVEPOINT語句中使用。ROLLBACK命令用來取消一組事務(wù)。
回滾到SAVEPOINT的語法如下:
ROLLBACK TO SAVEPOINT_NAME;
以下是打算從CUSTOMERS表中刪除這三個不同的記錄的一個例子。在每個刪除之前創(chuàng)建的保存點SAVEPOINT, 這樣就可以回滾到任何SAVEPOINT,并隨時在適當(dāng)時將數(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)在,這三個刪除已經(jīng)發(fā)生,假設(shè)你要改變主意,決定回滾到標(biāo)識為SP2的SAVEPOINT。 由于SP2在之后第一個刪除被創(chuàng)建,最后兩個刪除都被撤消:
SQL> ROLLBACK TO SP2; Rollback complete.
請注意,只有第一個刪除發(fā)生,因為它回滾到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)建的一個SAVEPOINT。
RELEASE SAVEPOINT的語法如下:
RELEASE SAVEPOINT SAVEPOINT_NAME;
一旦保存點已被釋放,使用ROLLBACK命令不能再撤消自SAVEPOINT進(jìn)行事務(wù)。
SET TRANSACTION命令可以被用來啟動一個數(shù)據(jù)庫事務(wù)。該命令用于指定隨后的事務(wù)特性。
例如,可以指定一個事務(wù)是只讀的,或讀寫。
SET TRANSACTION的語法如下:
SET TRANSACTION [ READ WRITE | READ ONLY ];