交 易區間定義了交易應用於方法上之邊界(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不需要在方法呼叫結束前完成或退回交易,在某方法結束時,容器暫停交易,而呼叫下一個方法時繼續交易