簡介交易區間(Transaction Demarcation)


交 易區間定義了交易應用於方法上之邊界(Boundaries),它告知何時該開始一個新的交易,或何時交易該被暫停,或者方法是否要在交易中進行。

當客戶端本身不在交易中,而呼叫另一個方法時,該方法可能:
  • 在非交易中進行
  • 啟始新的交易並於其中執行
  • 丟出例外

當客戶端本身在交易中,而呼叫另一個方法時,該方法可能:
  • 在客戶端的交易中進行
  • 啟始新的交易並於其中執行
  • 暫停客戶端交易,於非交易環境中執行
  • 丟出例外

交易區間的可能性,基本上由以上狀況組合(理論上最多可能有 3 x 4 = 12  種可能的組合),實際上根據您的實作選擇是使 用CMT(Container-Managed Transaction)或BMT(Bean-Managed Transaction),而可以設定不同的交易策略。

若使用CMT,您將交易區間管理交給容器來執行,您要設定交易區間策略給容器知曉,可設定六種策 略:REQUIRED、REQUIRES_NEW、SUPPORTS、MANDATORY、NOT_SUPPORTED、NEVER。

交 易區間策略

說 明

REQUIRED 支援現在的交易,如果沒有的話就建立 一個新的交易
REQUIRES_NEW 建立一個新的交易,如果現存一個交易 的話就先暫停,並啟始一個新的交易來執行
SUPPORTS 支援現在的交易,如果沒有的話就以非 交易的方式執行
MANDATORY 方法必須在一個現存的交易中進行,否 則丟出例外
NOT_SUPPORTED 指出不應在交易中進行,如果有的話就 暫停現存的交易
NEVER 指出不應在交易中進行,如果有的話就 丟出例外


在CMT時,若客戶端本身不在交易中,而呼叫另一個方法時,依該方法標註的策略,而會有的行為對應如下:
  • 在非交易中進行(SUPPORTS、NOT_SUPPORTED、NEVER)
  • 啟始新的交易並於其中執行(REQUIRED、REQUIRES_NEW)
  • 丟出例外(MANDATORY)

在CMT時,若客戶端本身 在交易中,而呼叫另一個方法時,依該方法標註的策略,而會有的行為對應如下:
  • 在客戶端的交易中進行(REQUIRED、SUPPORTS、MANDATORY)
  • 暫停客戶端交易,啟始新的交易 並於其中執行(REQUIRED_NEW)
  • 暫停客戶端交易,於非交易環境中執行(NOT_SUPPORTED)
  • 丟出例外(NEVER)

在BMT時,開發人員直接以編程的方式來進行交易:
  • 容器會在呼叫方法前暫停所有客戶端交易,方法結束後再繼續客戶端交易
  • 交易中不得有子交易,即啟始另一交易前必須結束前一交易
  • 無狀態Bean,即Stateless Session Bean、Message-Driven Bean若啟始交易,必須於方法呼叫結束前完成或退回交易
  • 有狀態Bean,容器允許多個 方法參與同一交易,即Stateful Session Bean不需要在方法呼叫結束前完成或退回交易,在某方法結束時,容器暫停交易,而呼叫下一個方法時繼續交易