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

Apache Geronimo EJB 事務選項權衡 (一):容器管理事務 (CMT) 核心機制與設定實戰

     編輯:Java 相關知識

系列第一部分奠基 EJB 事務基礎:ACID 特性、Flat 事務模型、CMT 核心優勢、六大事務屬性、部署描述符設定、XDoclet 產生、SessionSynchronization 同步介面、回滾機制。

一、事務基礎:ACID 與 Flat 模型

ACID 四大特性:

  • Atomicity (原子性):全做或全不做 (銀行轉帳扣款與入帳必須同時成功)
  • Consistency (一致性):事務前後系統處於合法狀態
  • Isolation (隔離性):並發事務互不干擾,透過鎖機制實現
  • Durability (持久性):提交後資料永久保存,故障可恢復

EJB 採用 Flat 事務模型:

  • 單一工作單元,只有 Commit 或 Rollback 兩種結果
  • 不支援 Nested 事務 (巢狀事務可獨立回滾不影響父事務)

二、CMT 核心優勢

  • 事務邏輯與業務邏輯分離,開發者專注業務
  • 宣告式事務邊界:部署描述符定義,無程式碼侵入
  • 客戶端無法濫用 Bean (事務始終有始有終)
  • Entity Bean **強制使用 CMT**

三、六大事務屬性 (Transaction Attributes)

定義 Bean 方法如何參與事務:

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 可接收事務邊界事件:

屬性行為適用場景
Required必須在事務中執行。有事務則加入,無則容器啟動新事務預設首選,大多數業務方法
RequiresNew總是啟動新事務。現有事務掛起,新事務結束後恢復獨立工作單元、審計日誌、獨立計數器
Supports有事務則加入,無則無事務執行非關鍵查詢、報表、輔助操作
Mandatory呼叫者必須已啟動事務,否則拋出異常。容器不建立新事務大系統一部分、第三方啟動事務、安全選項
NotSupported不在事務中執行。現有事務掛起,方法結束後恢復非系統關鍵操作、長時間報表、不需 ACID
Never呼叫者若有事務則拋出異常絕不參與事務的工具方法

七、CMT 禁止呼叫的方法

  • java.sql.Connection 的 commit()、rollback()、setAutoCommit()
  • EJBContext.getUserTransaction()
  • UserTransaction 任何方法

違規將導致容器拋出異常。

八、CMT 回滾機制

  1. 自動回滾:業務方法拋出 RuntimeException (含 EJBException),容器自動回滾
  2. 程式化回滾:呼叫 EJBContext.setRollbackOnly() 標記回滾,拋出 Application Exception (檢查型異常)。Application Exception **不** 自動觸發回滾

九、結語

CMT 以宣告式事務屬性將複雜事務管理外部化,配合 XDoclet 自動產生部署描述符,是 EJB 開發主流選擇。掌握六大屬性語義、方法級別覆蓋規則、SessionSynchronization 同步點、雙重回滾機制,即可駕馭 Geronimo/OpenEJB 上的容器管理事務。下一部分將探討 Bean 管理事務 (BMT)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法呼叫時機用途
afterBegin()新事務啟動後、業務方法前預載資料、準備快取
beforeCompletion()業務方法後、提交前寫回快取資料、可呼叫 setRollbackOnly() 強制回滾
afterCompletion(boolean committed)提交/回滾完成後true=提交成功,false=回滾,恢復狀態