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

Apache Geronimo EJB 事務選項權衡 (三):綜合實戰 — 並發控制、隔離級別、超時與分布式事務

     編輯:Java 相關知識

系列第三部分綜合探討 Geronimo 上 EJB 事務的進階主題:並發控制策略、隔離級別選擇、事務超時設定、分布式事務架構與兩階段提交協議,助您在容器管理 (CMT) 與 Bean 管理 (BMT) 事務間做出最佳選擇。

一、CMT vs BMT 選擇回顧

Sun 建議:預設使用 Required 屬性的 CMT。

二、並發控制策略:悲觀鎖 vs 樂觀鎖

面向容器管理事務 (CMT)Bean 管理事務 (BMT)
設定方式部署描述符宣告屬性程式碼中 UserTransaction API
邊界粒度方法級別程式碼區塊級別 (更細)
支援 Bean 類型Session、Entity、MDBSession、MDB (Entity 不支援)
適用場景標準業務邏輯、簡單事務邊界長時間流程、需精確控制提交/回滾時機

隔離級別調整屬於悲觀鎖機制一種。

三、隔離級別與資料一致性問題

四大隔離級別 (由低到高),效能遞減、一致性遞增:

策略悲觀鎖樂觀鎖
核心邏輯事務期間持有鎖,阻塞他人修改假設無衝突,提交時檢查版本/時間戳
實現方式資料庫 SELECT ... FOR UPDATE、隔離級別版本欄位、時間戳、全欄位比對
優點資料一致性強、實現簡單高併發效能好、無鎖等待
缺點擴展性差、易死鎖、長事務阻塞需應用層處理衝突重試、ABA 問題
適用場景高衝突率、短事務、強一致性需求低衝突率、高併發、長事務

三大一致性問題定義:

  • 髒讀:讀到未提交資料,後來回滾導致決策錯誤
  • 不可重複讀:同一事務兩次讀取同列資料,結果不同 (被他人修改)
  • 幻讀:同一事務兩次範圍查詢,筆數不同 (被他人新增/刪除)

四、BMT 中設定隔離級別

透過 JDBC Connection 直接控制:


// 取得 Connection (從 DataSource)
Connection conn = dataSource.getConnection();
// 設定隔離級別 (必須在事務開始前)
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
// 可用常數:
// TRANSACTION_READ_UNCOMMITTED
// TRANSACTION_READ_COMMITTED
// TRANSACTION_REPEATABLE_READ
// TRANSACTION_SERIALIZABLE

注意:

  • 非所有資料庫驅動支援動態調整隔離級別
  • 同一事務所有參與者應使用相同隔離級別
  • 不可在事務進行中切換隔離級別

五、CMT 中隔離級別限制

EJB 部署描述符 無法指定隔離級別。Geronimo (OpenEJB) CMT 預設使用 Read Committed。需精確控制隔離級別時,改用 BMT + JDBC 事務。

六、事務超時設定

BMT (JTA):


UserTransaction utx = ejbContext.getUserTransaction();
utx.setTransactionTimeout(30); // 30 秒後自動回滾
utx.begin();
// 業務邏輯...
utx.commit();

CMT: 在 Geronimo 專用部署描述符 (openejb-jar.xml) 中設定:



    
        MyBean
        *
    
    Required
    30 

七、分布式事務與兩階段提交 (2PC)

分布式事務定義

單一事務跨越多個物理資源 (資料庫、JMS、多台應用伺服器)。

  • Session Bean 更新 DB A → 呼叫另一 Bean 更新 DB B → 提交
  • Session Bean 更新 DB → 發送 JMS 訊息 → 同一事務
  • 跨應用伺服器:各自 Transaction Manager 協同

兩階段提交協議 (XA 協議)

階段一:準備

  1. 交易協調器發送「準備」給各事務管理器
  2. 各 TM 將操作寫入事務日誌,建立本地事務,通知資源管理器 (RM) 執行
  3. RM 執行操作,回報「準備提交」或「準備回滾」
  4. TM 向協調器回報結果

階段二:提交/回滾

  1. 協調器收到所有「準備提交」 → 廣播「提交」
  2. 任何一方「準備回滾」 → 廣播「回滾」
  3. 各 TM 指令 RM 提交/回滾,回報結果

Geronimo 事務管理器

  • 採用 JOTM (Java Open Transaction Manager),開源實作
  • 實作 XA 協議、編譯相容 JTA API
  • 所有參與者需同意通訊協議 (XA) 才能參與分布式事務

分布式事務代價

  • 效能顯著低於本地事務 (網路往返、日誌同步、多重鎖)
  • 系統資源佔用高、回應時間長
  • 除非跨資源強一致性不可妥協,否則優先考慮本地事務 + 補償機制

八、選型決策矩陣

隔離級別髒讀不可重複讀幻讀效能Geronimo 預設
Read Uncommitted✗✗✗最佳
Read Committed✓✗✗良好✓
Repeatable Read✓✓✗一般
Serializable✓✓✓最差
場景建議方案關鍵設定
單一資料庫、標準業務CMT + Required部署描述符 trans-attribute
長流程、需精確控制邊界BMT (JTA)UserTransaction API、setTransactionTimeout
高併發、低衝突樂觀鎖 + 版本欄位@Version (JPA) / timestamp
強一致性、短事務悲觀鎖 + Repeatable ReadBMT + JDBC setTransactionIsolation
跨多資料庫/資源分布式事務 (XA)JOTM、XADataSource、兩階段提交
跨應用伺服器分布式事務協調器設定、網路可靠性

九、結語

Geronimo (OpenEJB) 提供完整 EJB 事務支援。CMT 簡單宣告式適合 80% 場景;BMT 程式碼控制適合複雜邊界需求。隔離級別權衡一致性與效能,分布式事務威力大但代價高。架構師須依業務特性、併發模式、基礎設施能力,在簡單度、效能、正確性三角中找到平衡點。

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