EJB 容器管理事務 (CMT) 通過聲明式事務屬性定義方法邊界的事務傳播行為。正確選擇六大屬性 (Required、RequiresNew、Mandatory、NotSupported、Supports、Never) 是保證數據一致性與性能的關鍵。本文結合流程圖與決策矩陣,提供生產級選型指南。
| 屬性 | 客戶端有事務 | 客戶端無事務 | 典型場景 |
|---|---|---|---|
| Required (默認) | 加入現有事務 | 開啟新事務 | 90% 業務方法,增刪改查通用 |
| RequiresNew | 掛起現有 → 開啟新 → 完成後恢復 | 開啟新事務 | 獨立提交:日志記錄、審計、郵件發送 |
| Mandatory | 加入現有事務 | 拋出 TransactionRequiredException | 強制要求外層事務:核心業務邏輯、不可獨立執行 |
| NotSupported | 掛起現有 → 無事務執行 → 恢復 | 無事務執行 | 只讀查詢、長耗時計算、外部 API 調用 |
| Supports | 加入現有事務 | 無事務執行 | 輔助工具方法、可選事務上下文 |
| Never | 拋出 RemoteException | 無事務執行 | 嚴禁事務:特定報表查詢、非事務性資源訪問 |
方法是否修改數據?
├─ 是 → 是否必須在獨立事務提交?(如日志、審計)
│ ├─ 是 → RequiresNew
│ └─ 否 → 是否允許無事務調用?
│ ├─ 否 (核心業務) → Mandatory
│ └─ 是 (通用增刪改) → Required
└─ 否 (只讀/輔助)
├─ 是否為長耗時/外部調用? → NotSupported
├─ 是否嚴禁事務上下文? → Never
└─ 其他 → Supports
RuntimeException 觸發回滾,檢查型異常需 @ApplicationException(rollback=true) 或 setRollbackOnly()// 注解方式 (EJB 3.0+)
@Stateless
public class OrderService {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void createOrder(Order order) { ... }
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void logAudit(AuditRecord record) { ... }
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public List searchProducts(SearchCriteria c) { ... }
}
// ejb-jar.xml 覆蓋
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>OrderService</ejb-name>
<method-name>createOrder</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
// 客戶端無事務
orderService.createOrder(order);
// → 開啟事務 T1 (Required)
// orderDAO.save(order); // 加入 T1
// auditService.log(record); // RequiresNew → 掛起 T1,開啟 T2 提交,恢復 T1
// inventoryService.reserve(); // Mandatory → 加入 T1 (若 T1 被掛起則異常)
// → T1 提交
| EJB 屬性 | Spring propagation | 備註 |
|---|---|---|
| Required | PROPAGATION_REQUIRED | 默認值一致 |
| RequiresNew | PROPAGATION_REQUIRES_NEW | 行為一致 |
| Mandatory | PROPAGATION_MANDATORY | 行為一致 |
| NotSupported | PROPAGATION_NOT_SUPPORTED | 行為一致 |
| Supports | PROPAGATION_SUPPORTS | 行為一致 |
| Never | PROPAGATION_NEVER | 行為一致 |
掌握六大屬性語義,結合業務邊界設計事務策略,是構建健壯企業級應用的核心基本功。