BMT 基本規則
- 宣告
TX_BEAN_MANAGED 者,整個 Bean 所有方法皆為 BMT,不可混合
- 透過
setSessionContext() 或 setEntityContext() 參數取得 EJBContext
EJBContext.getUserTransaction() 取得 UserTransaction 管理交易
EJBContext 關鍵方法
public interface EJBContext {
UserTransaction getUserTransaction() throws IllegalStateException;
boolean getRollbackOnly();
void setRollbackOnly();
// ... 其他方法
}
有狀態 Session Bean 的交易特性
- 方法可建立交易並不結束即返回(交易跨方法)
- 容器偵測同一交易上下文允許重入;不同交易上下文則阻塞
- 若 Bean 不在交易中,新執行緒進入會建立自己的交易
- 容器不會自動結束方法建立的交易
無狀態 Session Bean 與 Entity Bean 限制
- 交易進行中不允許方法返回,否則拋出例外
- 因無狀態 Bean 實例共用,無法跨方法維持交易狀態
SessionSynchronization 介面:交易狀態回呼
public interface SessionSynchronization {
void afterBegin() throws RemoteException; // 交易開始
void beforeCompletion() throws RemoteException; // 提交前
void afterCompletion(boolean committed) throws RemoteException; // 結束後
}
- 僅 Stateful Bean 可實作(實作即代表需跨方法維持交易狀態)
- 容器自動偵測並回呼
- afterBegin:記錄業務方法在交易中執行
- beforeCompletion:提交前寫入資料庫等收尾工作
- afterCompletion:得知提交/回滾結果,修正內部狀態(不可維持交易資源)
重要限制
- 實作 SessionSynchronization 的 Bean 不可宣告為 Stateless(工具應偵測報錯)
- Stateless Bean 可參與交易但不可實作此介面
- SessionSynchronization 無法整合外部與內部交易
加入外部交易:setRollbackOnly / getRollbackOnly
- 所有 Bean 皆可用(不限 BMT)
setRollbackOnly():投票要求當前交易回滾(不直接觸發)
getRollbackOnly():檢查交易是否已被標記回滾,避免執行將被回滾的作業(如 DB 更新)
- 方法無參數,設計為單向投票,防止 Bean 互相覆蓋
客戶端發起交易
- 廠商可提供
Current 類別讓客戶端直接存取交易管理器
- 適用於跨多伺服器 Bean 的單一交易
- Stub/Skeleton 支援交易上下文隱性傳遞
資料庫操作與交易管理
- JDBC 連線不可使用 Auto-Commit
- 不可在連線上手動 commit/rollback
- 容器決定交易結果,驅動程式透明註冊連線到當前執行緒交易
- OTS術語:DB 連線為不可恢復資源,由交易服務隱性管理
- 嘗試用 SessionSynchronization 合併 DB 交易不可靠,不建議
分散式交易支援
- 跨伺服器呼叫時,Stub/Skeleton 必須隱性傳遞交易上下文
- 遠端 Skeleton 需提取上下文並關聯至遠端 Bean