18. PL/SQL 交易

     交易(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;

沒有留言:

張貼留言