交 易(Transaction)是一個單元工作(unit of work),包括一個起始點,標註交易開始,這個單元工作包括了數個步驟來完成,交易結束時的動作有兩個,數個步驟全部執行成功,交易才算成功並提交變 更,只有當中有一個失敗,則整個交易宣告失敗並回復所有變更。
交易的參與者包括:起始與結束交易的應用程式、交易的資源管理者(像是資料庫、訊息服務、應用伺服器),交易管理者在交易涉及多個資源時,負責協調交易時 的相關資源。
交易的四個基本要求是原子性(Atomicity)、一致性 (Consistency)、隔離行為(Isolation behavior)與持續性(Durability),依英文字母首字簡稱為ACID。
- 原子性
一個交易是一個單
元工作,當中可能包括數個步驟,這些步驟要嘛全部執行成功,若有一個失敗,則整個交易宣告失敗,交易中其它步驟也必須撤消曾經執行過的動作,回到交易前的
狀態,就像什麼事也沒有發生過。
在資料庫上執行單元工作為資料庫交易(database transaction),單元中每個步驟就是每一句SQL的執行,您要定義啟始一個交易邊界(通常是以一個BEGIN的指令開始),在所有的SQL語句 下達之後,再整個COMMIT進行所有的操作變更,此時交易成功,或者是因為某個SQL的錯誤,而進行ROLLBACK的動作,此時交易失敗。
交易的三種基本型態有Flat Transaction、Nested Transaction與Chanied Transaction。
在資料庫上執行單元工作為資料庫交易(database transaction),單元中每個步驟就是每一句SQL的執行,您要定義啟始一個交易邊界(通常是以一個BEGIN的指令開始),在所有的SQL語句 下達之後,再整個COMMIT進行所有的操作變更,此時交易成功,或者是因為某個SQL的錯誤,而進行ROLLBACK的動作,此時交易失敗。
交易的三種基本型態有Flat Transaction、Nested Transaction與Chanied Transaction。
- Flat Transaction
交易中無其它交易,為一個單元操作,簡單的程式示意如下:
begin transaction XXX
....
end transaction XXX
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
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(已入款)的情況。
例如轉帳的行為,A原有20000,B原有10000,A轉10000給B,交易成功的話,最後A必須變成10000,B變成20000,交易失敗的話, 必須A為20000,B為10000,而不能發生A為20000(未扣款),B也為20000(已入款)的情況。
- 隔離行為、隔離層級
在多人使用的環境
下,每個使用者可能進行自己的交易,交易與交易之間,必須互不干擾,使用者不會意識到別的使用者正在進行交易,就好像只有自己在進行操作一樣。
隔離設定與與特定的資源相關,並不在 Java EE 規範之中。
您可以進一步參考:簡 介隔離層級。
隔離設定與與特定的資源相關,並不在 Java EE 規範之中。
您可以進一步參考:簡 介隔離層級。
- 持續性
交易一旦成功,則
所有的變更必須保存下來,即使系統掛了,交易的結果也不能遺失,這個功能是建立在資料庫或相關資源伺服器之上。
在交易的定義上,可以使用宣告式(Declarative)或編程式(Programmatical)的方式,宣告式依賴於容器所提供的 服務,可以在定義檔上定義交易邊界、隔離層級等,無需修改程式原始碼,而編程式的交易則是直接使用JDBC或相關框架的API,以撰寫原始碼的方式,可 以更細部的定義交易邊界、隔離層級等資訊。