首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL XA 分散式交易限制:僅支援 InnoDB、外部 XA、無 JOIN/RESUME、PREPARED 狀態連線中斷回滾

     編輯:MySQL 資料庫相關知識

MySQL XA 交易實作為外部 XA(應用為 TM,MySQL 為 RM),僅 InnoDB 支援,且有多項規格限制。本文整理官方文件限制條款與實務影響。

核心限制清單

XA 交易基本流程

-- 1. 開始
XA START 'xid_string';

-- 2. 執行 SQL
UPDATE account SET balance=balance-100 WHERE id=1;
UPDATE account SET balance=balance+100 WHERE id=2;

-- 3. 結束
XA END 'xid_string';

-- 4. 準備(兩階段提交第一階段)
XA PREPARE 'xid_string';
-- 此時寫入 binlog、redo log,交易持久化但未提交

-- 5. 提交或回滾(第二階段)
XA COMMIT 'xid_string';   -- 或 XA ROLLBACK 'xid_string'

xid 格式

xid: gtrid [, bqual [, formatID ]]
-- gtrid: 全域交易 ID
-- bqual: 分支限定符(MySQL 要求同一全域交易內唯一)
-- formatID: 格式識別碼(通常 1)

實務建議

  • ✅ 確認所有參與表皆為 InnoDB
  • ✅ 應用層 TM 自行管理 bqual 唯一性
  • ✅ 連線池設定:避免 PREPARED 狀態下連線被回收/斷線
  • ✅ 監控 XA RECOVER 發現孤兒 PREPARED 交易
  • ⚠️ 跨引擎交易(如 InnoDB + MyISAM)**無法用 XA 保證原子性**

相關指令

XA RECOVER;           -- 列出所有 PREPARED 交易
XA COMMIT 'xid';      -- 提交
XA ROLLBACK 'xid';    -- 回滾
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
限制項目說明
儲存引擎**僅 InnoDB** 支援 XA
XA 架構**外部 XA**:MySQL=RM,Client=TM。未實作內部 XA(跨引擎交易)
XA START**不支援** JOIN、RESUME 子句
XA END**不支援** SUSPEND [FOR MIGRATE] 子句
xid 的 bqual 部分全域交易內每個 XA 分支的 bqual **必須唯一**(MySQL 額外限制,非 XA 標準)
PREPARED 狀態下 Client 斷線**Server 會自動回滾**,即使已 PREPARED。無法在不改二進制日誌機制下提交/回滾
Server Crash 後重啟PREPARED 交易**可繼續**提交/回滾(正常恢復流程)