交易(Transaction)是資料庫系統中一個主要的特性,而什麼是交易呢?交易的目的又是麼呢?簡單的來說交易就是使用者對資料庫作一系列的處理動作,而這一系列的動作裡面又分為數的作業,舉一個例子,當我們在提款機前提款時,從插入提款卡開始,到領到錢時可分為數個作業流程,大致上依序是輸入帳號/密碼、輸入所需金額、系統確認金額、系統扣款、領錢與退卡等等,這一系列的作業,也就是交易(Transaction),當這一系列的作業完成這個交易(Transaction)才算是完整的結束,一但當其中有任何一個作業中斷,如停電等等,整個作業就會退回原點,而一般來說資料庫的交易(Transaction)是符合A.C.I.D四大特性,這四大特性依序如下:
- 單元性(Atomicity):異動作業整個過程必須要看成一個不可分割的完整個體,此一特性稱為「單元性」( Atomicity ) 。也就是說整個異動作業只有兩個選項,必需全部做完或全部不做也就是說完整反映或是不完整反映,沒有第三種選擇,如所示。
- 一致性(Consistency):當多個異動作業同時交錯執行時,執行完成後的異動作業結果必須要與這些異動作業順序相同,此一特性稱為「一致性」( Concurrency ) ,如圖所示。
- 隔離性(Isolation):當異動作業執行的過程中所用到的資料,或是正在產生中的結果不能給其它異動作業讀取或更改,此特性稱為「隔離性」(Isolation)。
- 持續性(Durability):如果異動作業執行的過程完全正常,但當透過「確認」( Commit )指令後將異動的結果寫入資料庫系統內,就必須永久生效,如果當異動結果寫入到資料庫系統的過程中,系統卻發生錯誤,那麼當系統回復後,就應該將原本已執行「確認」( Commit )指令後將異動的結果後續動作完成,此特性稱為「持續性」(Durability)。
開始/結束交易
交易都有開始和結束。交易開始時有下列事件之一:
- 連接到資料庫後執行的第一個SQL語句。
- 在交易完成之後發出每一個新的SQL語句完成。
交易結束時的下列事件之一發生:
- COMMIT或發出ROLLBACK語句。
- DDL語句,如CREATE TABLE語句,則發出;因為在這種情況下,COMMIT被自動執行。
- 一個DCL語句,比如一個GRANT語句發出; 因為在這種情況下,COMMIT會被自動執行。
- 使用者連線從資料庫中斷。
- 從SQL* PLUS用戶退出通過發出EXIT指令,COMMIT自動執行。
- SQL* Plus異常終止,自動執行ROLLBACK。
- 一個DML語句失敗; 在這種情況下自動執行撤消DML語句ROLLBACK。
Commit交易
交易是透過SQL指令COMMIT永久生效。COMMIT命令的一般語法是:
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; |
Rollback交易
對資料庫所做的動作不Commit更改可以使用ROLLBACK命令撤消。
ROLLBACK命令的一般語法是:
ROLLBACK [TO SAVEPOINT < saveyiibai_name>];
|
當一個交易因一些前所未有的情況中止,如系統故障,則整個交易由於提交自動Rollback。如果不使用Save point,然後簡單地使用下面的語法來Rollback所有的變化
ROLLBACK;
|
Savepoint
Savepoint是某種標誌,協助將一個長Transaction分成更小的單位並設置了一些檢查點。由一個長交易中設置Savepoint,可以根據需要Rollback到一個Savepoint。Savepoint語法如下:
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。
自動交易控製
要執行一個自動COMMIT在每一個INSERT,UPDATE或DELETE執行時,可以設置AUTO COMMIT環境變數:
SET AUTOCOMMIT ON;
|
可以關閉使用以下命令自動提交模式:
SET AUTOCOMMIT OFF;
|
沒有留言:
張貼留言