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

EJB 交易進階:Bean 管理交易細節、SessionSynchronization 與 JDBC 整合

     編輯:J2EE

Bean 管理交易 (BMT) 實作細節

聲明 TX_BEAN_MANAGED 適用於整個 Bean,不可混用。Bean 透過 setSessionContext 或 setEntityContext 參數取得 EJBContext,再呼叫 getUserTransaction() 獲得 UserTransaction 介面自行控制交易。

有狀態 Session Bean

  • 方法中可 begin() 交易並不結束即返回
  • 容器檢測同一交易上下文允許重入
  • 不同交易上下文嘗試進入會被阻塞直到當前交易結束
  • Bean 不在交易時,新呼叫以自身交易執行,容器掛起呼叫者交易

無狀態 Session Bean / Entity Bean

  • 方法執行期間交易必須結束,否則容器拋出例外
  • 跨方法保持交易開啟屬於有狀態行為,違反無狀態契約

SessionSynchronization 介面:容器與 Bean 交互協議

僅有狀態 Session Bean 可實作。容器自動檢測並回呼:

  1. afterBegin():交易開始,Bean 可記錄狀態、準備資料庫操作
  2. beforeCompletion():提交前,寫入快取資料、驗證邏輯
  3. afterCompletion(boolean):交易完成(提交/回滾),修正內部狀態

若 Bean 已在另一交易中,新呼叫阻塞直到前一交易完成並調用 afterCompletion。回滾時不調用 beforeCompletion。實作此介面的 Bean 不得宣告為無狀態,廠商工具應檢查。

無狀態 Bean 參與交易

可參與容器管理交易 (TX_REQUIRED 等) 或 BMT,但不可實作 SessionSynchronization。容器確保方法進入時無現有交易上下文(必要時掛起)。

EJBContext 回滾投票機制

setRollbackOnly() / getRollbackOnly() 供所有 Bean 使用(不限 BMT)。標記交易回滾,不直接觸發。防止 Bean 互相干擾投票。Bean 可檢查狀態決定是否執行昂貴操作(如資料庫更新)。

客戶端劃分交易範例

Current current = new Current();
current.setServiceProvider(txMgrURL);
current.create();
current.begin();
// ... 呼叫多個遠端 Bean 方法 ...
current.commit();

Stub/Skeleton 隱式傳播交易上下文。

JDBC 與容器管理交易整合

  • 連線不可用自動提交
  • Bean 程式碼不得手動 commit/rollback
  • JDBC 驅動透明將連線註冊為 OTS Resource,容器協調兩階段提交
  • 非交易感知驅動程式操作不屬於 Bean 交易,不可靠
  • 勿嘗試用 SessionSynchronization 合併連線交易與 Bean 交易

分散式交易實作需求

廠商須支援:客戶端跨伺服器交易、Bean 呼叫遠端 Bean。EJBObject Stub/Skeleton 隱式取得/傳播交易上下文,遠端 Skeleton 關聯至本地交易。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved