首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

EJB Bean-Managed Transaction (BMT) 深度解析:UserTransaction、SessionSynchronization 與交易傳播

     編輯:J2EE

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved