簡介交易管理


交易(Transaction)是一個單元工作(unit of work),這個單元工作包括了數個步驟來完成,這數個步驟必須全部執行成功,交易才算成功,只有當中有一個失敗,則整個交易宣告失敗。

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

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

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

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

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

  • 持續性
交易一旦成功,則所有的變更必須保存下來,即使系統掛了,交易的結果也不能遺失。

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