系列第一部分奠基 EJB 事務基礎:ACID 特性、Flat 事務模型、CMT 核心優勢、六大事務屬性、部署描述符設定、XDoclet 產生、SessionSynchronization 同步介面、回滾機制。
| 屬性 | 行為 | 適用場景 |
| Required | 必須在事務中執行。有事務則加入,無則容器啟動新事務 | 預設首選,大多數業務方法 |
| RequiresNew | 總是啟動新事務。現有事務掛起,新事務結束後恢復 | 獨立工作單元、審計日誌、獨立計數器 |
| Supports | 有事務則加入,無則無事務執行 | 非關鍵查詢、報表、輔助操作 |
| Mandatory | 呼叫者必須已啟動事務,否則拋出異常。容器不建立新事務 | 大系統一部分、第三方啟動事務、安全選項 |
| NotSupported | 不在事務中執行。現有事務掛起,方法結束後恢復 | 非系統關鍵操作、長時間報表、不需 ACID |
| Never | 呼叫者若有事務則拋出異常 | 絕不參與事務的工具方法 |
MDB 僅支援兩種屬性:
- Required (預設):訊息處理必須在事務中
- NotSupported:訊息處理不在事務中
四、部署描述符設定 (ejb-jar.xml)
1. 指定事務類型
MySession
...
Container
2. 方法級別指定屬性
ClaimRecord
*
Required
ClaimRecord
updateClaimNumber
Mandatory
Coverage
*
RequiresNew
方法屬性優先於類別屬性。method-intf 可區分 Local/Remote 介面,method-params 區分多載方法。
五、XDoclet 產生部署描述符 (實務標準做法)
Session Bean 類別註解:
/**
* @ejb.bean
* name="SampleSession"
* type="Stateless"
* transaction-type="Container"
* ...
* @ejb.interface generate="local,remote"
* @ejb.home generate="local,remote"
* @ejb.util generate="physical"
*/
public abstract class SampleSessionBean implements SessionBean {
/**
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*/
public void doSomething(String param) { ... }
/**
* @ejb.interface-method view-type="both"
* @ejb.transaction type="RequiresNew"
*/
public void doSomethingElse(String param) { ... }
/**
* @ejb.create-method
* @ejb.transaction type="Required"
*/
public void ejbCreate() throws CreateException { ... }
}
Entity Bean 類別註解:
/**
* @ejb.bean type="CMP" cmp-version="2.x" name="Claim" transaction-type="Container"
* @ejb.transaction type="Required"
* @ejb.persistence table-name="Claim"
*/
public abstract class ClaimBean implements EntityBean { ... }
編譯時 XDoclet 產生完整 ejb-jar.xml,含 transaction-type、container-transaction 等元素。
六、SessionSynchronization:Stateful Bean 事務同步通知
Stateful Session Bean 實作 javax.ejb.SessionSynchronization 可接收事務邊界事件:
| 方法 | 呼叫時機 | 用途 |
afterBegin() | 新事務啟動後、業務方法前 | 預載資料、準備快取 |
beforeCompletion() | 業務方法後、提交前 | 寫回快取資料、可呼叫 setRollbackOnly() 強制回滾 |
afterCompletion(boolean committed) | 提交/回滾完成後 | true=提交成功,false=回滾,恢復狀態 |
七、CMT 禁止呼叫的方法
java.sql.Connection 的 commit()、rollback()、setAutoCommit()
EJBContext.getUserTransaction()
UserTransaction 任何方法
違規將導致容器拋出異常。
八、CMT 回滾機制
- 自動回滾:業務方法拋出 RuntimeException (含
EJBException),容器自動回滾
- 程式化回滾:呼叫
EJBContext.setRollbackOnly() 標記回滾,拋出 Application Exception (檢查型異常)。Application Exception **不** 自動觸發回滾
九、結語
CMT 以宣告式事務屬性將複雜事務管理外部化,配合 XDoclet 自動產生部署描述符,是 EJB 開發主流選擇。掌握六大屬性語義、方法級別覆蓋規則、SessionSynchronization 同步點、雙重回滾機制,即可駕馭 Geronimo/OpenEJB 上的容器管理事務。下一部分將探討 Bean 管理事務 (BMT)。
- 上一篇文章: Apache Geronimo EJB 事務選項權衡 (二):Bean 管理事務 (BMT) 完整實作指南
- 下一篇文章: Java 實作撲克牌發牌演算法完整指南
Copyright ©
程式碼之家 All Rights Reserved