配置全域事務超時 100,000 秒、分支事務超時 86,400 秒,實際卻在 10 分鐘左右拋出 TransactionTimeoutException: Timed out after 100000 seconds。經排查,發現 WebLogic 內部存在不可配置的狀態切換超時常量,與用戶配置的全域超時獨立運作。
事務經歷狀態:New → PrePrepared → Logging → Prepared → Committed/Rolled Back。各階段切換有硬編碼超時:
| 狀態轉換 | 內部超時 | 關鍵工作 |
|---|---|---|
| PrePrepared → Logging | 60 秒 | 所有 XA/Non-XA Resource 準備 |
| Logging → Prepared | 30 秒 | 寫入 TLOG(事務日誌) |
| Prepared → Committed | 120 秒 | Non-XA Commit → SubCoordinator Commit → Coordinator Commit |
狀態切換完成後,WebLogic 呼叫 wakeUpAfterSeconds(constant) 設定定時器。若在該常量時間內未完成下一階段工作,事務被標記超時並回滾,完全忽略用戶設定的全域超時。
####<Debug> <JTA2PC> ... wakeUpAfterSeconds(120)
at weblogic.transaction.internal.ServerTransactionImpl.setPreparedUnsync(...)
at weblogic.transaction.internal.ServerTransactionImpl.globalPrepare(...)
at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(...)
日誌顯示事務進入 Prepared 狀態,設定 120 秒切換超時。若協調者與參與者網絡延遲高、資源鎖競爭激烈,極易觸發此內部超時。
-Dweblogic.debug.DebugJTA2PC=true -Dweblogic.debug.DebugJTA2PCStackTrace=true
可輸出詳細狀態切換堆疊,定位具體卡在哪個 Resource 的 prepare/commit 階段。
⚠️ 這些內部常量在 WebLogic 9.x/10.x/12c 中均為硬編碼,無法通過配置文件或 MBean 修改。遇到無法規避的場景,需聯繫 Oracle 支援或評估遷移至其他事務管理器(如 Narayana/JTA)。