| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 效能 | Geronimo 預設 |
| Read Uncommitted | ✗ | ✗ | ✗ | 最佳 | |
| Read Committed | ✓ | ✗ | ✗ | 良好 | ✓ |
| Repeatable Read | ✓ | ✓ | ✗ | 一般 | |
| Serializable | ✓ | ✓ | ✓ | 最差 | |
三大一致性問題定義:
- 髒讀:讀到未提交資料,後來回滾導致決策錯誤
- 不可重複讀:同一事務兩次讀取同列資料,結果不同 (被他人修改)
- 幻讀:同一事務兩次範圍查詢,筆數不同 (被他人新增/刪除)
四、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 協議)
階段一:準備
- 交易協調器發送「準備」給各事務管理器
- 各 TM 將操作寫入事務日誌,建立本地事務,通知資源管理器 (RM) 執行
- RM 執行操作,回報「準備提交」或「準備回滾」
- TM 向協調器回報結果
階段二:提交/回滾
- 協調器收到所有「準備提交」 → 廣播「提交」
- 任何一方「準備回滾」 → 廣播「回滾」
- 各 TM 指令 RM 提交/回滾,回報結果
Geronimo 事務管理器
- 採用 JOTM (Java Open Transaction Manager),開源實作
- 實作 XA 協議、編譯相容 JTA API
- 所有參與者需同意通訊協議 (XA) 才能參與分布式事務
分布式事務代價
- 效能顯著低於本地事務 (網路往返、日誌同步、多重鎖)
- 系統資源佔用高、回應時間長
- 除非跨資源強一致性不可妥協,否則優先考慮本地事務 + 補償機制
八、選型決策矩陣
| 場景 | 建議方案 | 關鍵設定 |
| 單一資料庫、標準業務 | CMT + Required | 部署描述符 trans-attribute |
| 長流程、需精確控制邊界 | BMT (JTA) | UserTransaction API、setTransactionTimeout |
| 高併發、低衝突 | 樂觀鎖 + 版本欄位 | @Version (JPA) / timestamp |
| 強一致性、短事務 | 悲觀鎖 + Repeatable Read | BMT + JDBC setTransactionIsolation |
| 跨多資料庫/資源 | 分布式事務 (XA) | JOTM、XADataSource、兩階段提交 |
| 跨應用伺服器 | 分布式事務 | 協調器設定、網路可靠性 |
九、結語
Geronimo (OpenEJB) 提供完整 EJB 事務支援。CMT 簡單宣告式適合 80% 場景;BMT 程式碼控制適合複雜邊界需求。隔離級別權衡一致性與效能,分布式事務威力大但代價高。架構師須依業務特性、併發模式、基礎設施能力,在簡單度、效能、正確性三角中找到平衡點。
- 上一篇文章: JSF 轉換與驗證深度解析:從生命週期到自訂實作完整指南
- 下一篇文章: Apache Geronimo EJB 事務選項權衡 (二):Bean 管理事務 (BMT) 完整實作指南
Copyright ©
程式碼之家 All Rights Reserved