簡介交易


交 易(Transaction)是一個單元工作(unit of work),包括一個起始點,標註交易開始,這個單元工作包括了數個步驟來完成,交易結束時的動作有兩個,數個步驟全部執行成功,交易才算成功並提交變 更,只有當中有一個失敗,則整個交易宣告失敗並回復所有變更。

交易的參與者包括:起始與結束交易的應用程式、交易的資源管理者(像是資料庫、訊息服務、應用伺服器),交易管理者在交易涉及多個資源時,負責協調交易時 的相關資源。

交易的四個基本要求是原子性(Atomicity)、一致性 (Consistency)、隔離行為(Isolation behavior)與持續性(Durability),依英文字母首字簡稱為ACID。
  • 原子性
一個交易是一個單 元工作,當中可能包括數個步驟,這些步驟要嘛全部執行成功,若有一個失敗,則整個交易宣告失敗,交易中其它步驟也必須撤消曾經執行過的動作,回到交易前的 狀態,就像什麼事也沒有發生過。

在資料庫上執行單元工作為資料庫交易(database transaction),單元中每個步驟就是每一句SQL的執行,您要定義啟始一個交易邊界(通常是以一個BEGIN的指令開始),在所有的SQL語句 下達之後,再整個COMMIT進行所有的操作變更,此時交易成功,或者是因為某個SQL的錯誤,而進行ROLLBACK的動作,此時交易失敗。

交易的三種基本型態有Flat Transaction、Nested Transaction與Chanied Transaction。
    • Flat Transaction
交易中無其它交易,為一個單元操作,簡單的程式示意如下:
begin transaction XXX
    ....
end transaction XXX
    • Nested Transaction
在交易中包括其它交易,外部交易要成功,內部交易必須全部成功,應用程式可以重試內部交易,若有外部交易回復,則內部所有交易都要回復,簡單的程式示意如下:
begin transaction XXX
    begin transaction OOO
        ....
    end transaction OOO
    begin transaction ZZZ
    ....
    end transaction ZZZ
end transaction XXX
    • Chanied Transaction
交易不僅有單一提交點,而可以有多個中斷點(break point),若要回復,則回復動作將至上一個中斷點,而非整個交易被回復。

該開始一個新的交易,或何時交易該被暫停,或者方法是否要在交易中進行,這是由 交易區間(Transaction Demarcation) 或稱傳播行為(Propagation behavior)所定義,它定義了交易的邊界(Boundaries)。

  • 一致性
指交易所作用的資 料集合在交易前後必須一致,也就是這組資料集合若交易成功,則整個資料集合都必須是交易操作後的狀態,若交易失敗,所整個資料集合必須與開始交易之前一樣 完全沒有變更,不能發生整個資料集合,部份有變更,而部份沒變更的狀態。

例如轉帳的行為,A原有20000,B原有10000,A轉10000給B,交易成功的話,最後A必須變成10000,B變成20000,交易失敗的話, 必須A為20000,B為10000,而不能發生A為20000(未扣款),B也為20000(已入款)的情況。

  • 隔離行為、隔離層級
在多人使用的環境 下,每個使用者可能進行自己的交易,交易與交易之間,必須互不干擾,使用者不會意識到別的使用者正在進行交易,就好像只有自己在進行操作一樣。

隔離設定與與特定的資源相關,並不在 Java EE 規範之中。

您可以進一步參考:簡 介隔離層級

  • 持續性
交易一旦成功,則 所有的變更必須保存下來,即使系統掛了,交易的結果也不能遺失,這個功能是建立在資料庫或相關資源伺服器之上。

在交易的定義上,可以使用宣告式(Declarative)或編程式(Programmatical)的方式,宣告式依賴於容器所提供的 服務,可以在定義檔上定義交易邊界、隔離層級等,無需修改程式原始碼,而編程式的交易則是直接使用JDBC或相關框架的API,以撰寫原始碼的方式,可 以更細部的定義交易邊界、隔離層級等資訊。