企業級應用現代化進程中,將 CICS 核心業務與 J2EE 平台實現事務級集成是高頻剛需。本文基於 J2EE Connector Architecture (JCA) 與 CICS Transaction Gateway (CICS TG),系統闡述事務模型差異、資源適配器分類、兩階段提交 (2PC) 原理、Last Participant Support (LPS) 機制、WebSphere 容器事務控制及部署場景決策,為架構師與開發者提供落地指南。
| 維度 | J2EE 事務 | CICS 事務 |
| 定義 | 不可分割的工作單元 (Atomic Unit of Work),多資源管理器協調更新 | 由 Transaction ID (TRANID) 觸發,運行在 CICS Task 下,含多個 Unit of Work (UOW),同步點分隔 |
| 協調者 | Transaction Manager (TM) | CICS 自身充當 TM |
| 資源管理器 | JDBC DataSource, JMS, CICS (via JCA) 等 | VSAM, DB2, IMS, Temporary Storage, Transient Data 等 |
| 同步點 | TM 驅動 2PC | EXEC CICS SYNCPOINT (顯式/隱式) |
核心洞見:CICS UOW 類比 J2EE 事務;CICS Task 可跨多個 UOW。集成關鍵在於讓 J2EE TM 能協調 CICS 資源管理器參與全局事務。
二、 JCA 系統契約與資源適配器分類
JCA 定義資源適配器需實現的系統契約:連接管理、事務管理、安全管理。根據事務能力,資源適配器在 ra.xml 中聲明三類:
- XATransaction:實現
XAResource,支持全局 2PC,能影響全局事務結果。CICS ECI XA Resource Adapter (TG v6.1 z/OS 專供)。
- LocalTransaction:僅支持資源管理器本地事務 (RMLT),無 2PC 能力。CICS ECI Resource Adapter (JCA 1.0/1.5,跨平台)。
- NoTransaction:無事務屬性,不參與協調。CICS EPI Resource Adapter (面向 3270 終端橋接,不適合事務集成)。
三、 兩階段提交 (2PC) 與 Last Participant Support (LPS)
標準 2PC 流程
- Phase 1 (Prepare):TM 要求所有 XA 資源管理器 Prepare。RM 持久化重做/回滾日誌,投票
Prepared 或 RolledBack。投票 Prepared 後進入 In-doubt (未決) 狀態,等待 TM 最終決議。
- Phase 2 (Commit/Rollback):全投 Prepared → TM 發送 Commit;否則 Rollback。RM 完成持久化更新、釋放鎖,回應
Committed。TM 收齊所有 Committed 事務結束。TM 失敗重啟後通過 Recovery Log 與 RM 重新同步完成提交/回滾。

LPS:單階段資源參與全局事務的妥協方案
場景:全局事務包含多個 XA RM + 一個 LocalTransaction RM (如 CICS ECI RA)。
機制:
- TM 先 Prepare 所有 XA RM。
- Prepare 成功 → TM 調用 Local RM 的
LocalTransaction.commit()。
- Local RM Commit 成功 → TM 發送 Commit 給所有 XA RM;失敗 → TM 發送 Rollback 給所有 XA RM。

風險 (Heuristic Hazard):Local RM Commit 過程中通訊失敗,TM 無法確定其結果 → 混合結果風險。必須 在部署描述符 (XDD) 啟用 Accept heuristic hazard,並建議開啟 TM 的 Enable logging for heuristic reporting。
四、 CICS TG 事務支持矩陣
| 資源適配器 | 事務類型 | 平台 | 關鍵協議/特性 | 適用 WebSphere 版本 |
| CICS ECI RA | LocalTransaction (RMLT) | z/OS, 分布式 | ECI (SYNC_SEND_RECEIVE), SYNCONRETURN | WAS V5/V5.1/V6 (JCA 1.0/1.5) |
| CICS ECI XA RA | XATransaction (Global 2PC) | 僅 z/OS | Transactional EXCI + RRS, XAResource 實現 | WAS V6 (JCA 1.5) + CICS TG v6.1 z/OS + CICS TS z/OS |
| CICS EPI RA | NoTransaction | 分布式 | 3270 Bridge | 不適用事務集成 |
z/OS 獨有優勢:本地模式 (ConnectionURL=local) 直接調用 EXCI,利用 MVS RRS 實現高性能 2PC,無網絡開銷;支持跨克隆 TG Daemon TCP/IP 負載均衡。
五、 WebSphere 容器事務控制策略
Web 容器
- 支持全局事務 (BMT) via
UserTransaction,不支持 CMT。
- 支持 RMLT via
Connection.getLocalTransaction()。
- 事務壽命限制在單個 HTTP Request 內,
service() 結束未完成的全局事務將被回滾。
EJB 容器:CMT 為首選
通過 ejb-jar.xml <trans-attribute> 聲明:
| 屬性 | ECI 調用類型 | CICS Mirror Task 事務範圍 |
| Required / RequiresNew / Mandatory | XA Transaction | Long-running (Extended LUW) |
| Supports | 視上下文:有全局事務用 XA,無則受 LTC 控制 | Synconreturn 或 Long-running |
| NotSupported / Never | Non-extended (SYNCONRETURN) | Synconreturn (獨立 UOW) |
LTC (Local Transaction Container):非全局事務上下文下的劃界機制。由 XDD 三屬性控制:Boundary (BeanMethod/ActivitySession)、Resolver (ContainerAtBoundary/Application)、UnresolvedAction (Commit/Rollback)。Web 組件僅能配置 UnresolvedAction。
六、 關鍵部署場景決策樹
- Servlet 同一事務多 ECI 請求? → 默認每請求自動 Commit (SYNCONRETURN)。需同一事務:改用 EJB CMT 或 Servlet BMT (
UserTransaction + XA RA)。
- 鏈接發 SYNCPOINT 的 CICS 程序? → 必須用 SYNCONRETURN (非擴展),否則協調者衝突。Web 容器默認如此;EJB 用 Never/NotSupported 實現。
- EJB 同一事務多 ECI 請求? → 用 Required/RequiresNew (XA RA) 實現 Long-running Mirror Task。
- 全局事務中調用 CICS 部分? 四種路徑:
- CICS ECI XA RA (TG v6.1 z/OS) —— 標準 2PC,跨多 CICS 區及 XA RM。
- WAS z/OS RRS 全局事務 (ECI RA + RRS) —— z/OS 本地優化,無 XA 流開銷。
- 單一 CICS 區優化 (Single 1PC Optimization) —— 全局事務僅一個 RM 分支,TM 降級為 1PC Commit。
- LPS (Last Participant Support) —— 多 XA RM + 一個 CICS ECI RA (LocalTransaction),需接受 Heuristic 風險。
- z/OS WAS 事務差異? → ECI RA 通過 RRS 直接支持全局事務,無需 XA RA;不支持 Bean 管理的 LocalTransaction (
Connection.getLocalTransaction())。
- 網絡故障處理? → Prepare 前斷開 → RRS 標記 Rollback;Commit 階段斷開 → In-doubt 掛起,連接恢復等待 TM 決議。
- 單階段優於兩階段? → 單次 CICS 調用、無其他 RM 更新 → 用 SYNCONRETURN 非事務請求最簡單高效;單一 CICS 系統承載所有更新 → LocalTransaction (RMLT) 性能優於 XA,但缺乏恢復邏輯。
- 全局事務混用 Local + XA RA? → EJB 容器拋異常阻止 (非法嘗試),除非啟用 LPS。
- ECIRequest/CCF 類支持? → WAS V5 僅 Web 容器支持,非 JCA 托管,無法參與 RMLT/全局事務,需自行補償邏輯。
- CICS 異常終止 (ABEND)? → XA 協議假定中止,處理態故障自動回滾。ABEND 觸發自動回滾兩途徑:
- CICS TS V2+ 設置
DFHXCOPT ABENDBKOUT=YES (APAR PK17426/7)。
- J2EE 捕獲
CICSTxnAbendException → sessionCtx.setRollbackOnly() 強制回滾。
七、 總結
JCA 事務管理契約是連接 J2EE 與 CICS 的基石。選型決策取決於:
- 平台 (z/OS vs 分布式) → 決定是否可用 XA RA / RRS。
- 容器 (Web vs EJB) → 決定 CMT/BMT/LTC 可用性。
- 事務邊界範圍 (單 CICS 區 vs 多 RM) → 決定 2PC / 1PC優化 / LPS。
- 風險承受度 (Heuristic Hazard) → 決定是否啟用 LPS。
建議:新建 z/OS 集成優先採用 CICS ECI XA RA + RRS;分布式平台或存量系統視場景選 RMLT + SYNCONRETURN 或 LPS;嚴禁在全局事務中直接混用 LocalTransaction RA 與 XA RA (未啟用 LPS 時)。
- 上一篇文章: 基於 Spring 框架的電力負荷管理系統設計與實現
- 下一篇文章: Eclipse 生成 Javadoc 亂碼問題徹底解決方案
Copyright ©
程式碼之家 All Rights Reserved