EJB 交易模型基於 CORBA OTS (Object Transaction Service)。OTS 核心組件:
容器代表 Bean 使用 Control 物件管理交易,Bean 不直接存取。
Entity Bean 屬於「交易物件」:無 commit/rollback 方法,容器代管交易,Bean 管理的可恢復資源(Resource)透明加入交易。Bean 可透過 EJBContext.setRollbackOnly() 投票要求回滾。
| 屬性 | 行為 |
|---|---|
| TX_NOT_SUPPORTED | 掛起現有交易,無交易上下文執行 |
| TX_SUPPORTS | 若有交易則加入,否則無交易執行 |
| TX_REQUIRED | 必須在交易中執行;無則容器啟動新交易 |
| TX_REQUIRES_NEW | 總是啟動新交易;掛起現有交易 |
| TX_MANDATORY | 呼叫時必須已在交易中,否則拋出例外 |
| TX_BEAN_MANAGED | Bean 自行管理交易邊界 |
JTS 為底層交易服務的 Java 介面封裝,核心 UserTransaction 介面提供 begin()、commit()、rollback()、setRollbackOnly()、setTransactionTimeout()、getStatus() 等方法。僅供 TX_BEAN_MANAGED Bean 或客戶端劃分交易使用。
SessionContext/EntityContext 取得 UserTransaction實作 javax.ejb.SessionSynchronization:
afterBegin():交易開始後通知beforeCompletion():提交前通知(回滾時不調用)afterCompletion(boolean committed):交易完成通知結果實作此介面暗示 Bean 跨方法維護交易狀態,故必須為有狀態 Bean。無狀態 Bean 不得實作。
任何 Bean 可呼叫 setRollbackOnly() 標記交易回滾,getRollbackOnly() 檢查狀態。設計為無參數,防止 Bean 互相覆蓋投票。
客戶端可透過 UserTransaction 跨多伺服器 Bean 劃分交易。資料庫連線(JDBC)不得使用自動提交,容器透明將連線註冊至當前交易(OTS Resource 模式),交易結束時自動提交/回滾。非交易感知 JDBC 驅動程式不可靠,不建議使用。
廠商須為 EJBObject 產生支援交易上下文傳播的 Stub/Skeleton。遠端 Bean 的 Skeleton 需提取上下文並關聯至本地交易。適用場景:客戶端跨伺服器交易、Bean 呼叫遠端 Bean。