| 限制項目 | 說明 |
| 儲存引擎 | **僅 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 交易**可繼續**提交/回滾(正常恢復流程) |
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'; -- 回滾
- 上一篇文章: MySQL NULL 值完整指南:與空字串差異、IS NULL、索引、排序、聚合函數、特殊型別行為
- 下一篇文章: MySQL 搜尋大小寫敏感度:預設不敏感、COLLATE 強制敏感、二進位比較、字符集關係
Copyright ©
程式碼之家 All Rights Reserved