MySQL默认max_prepared_transactions=0禁用XA事务,必须在my.cnf中显式设为≥32(建议峰值并发1.5倍),重启生效;innodb_support_xa已废弃,InnoDB始终支持XA;表须为InnoDB引擎,REPEATABLE-READ隔离级别即可;执行XA RECOVER需显式授予XA_RECOVER_ADMIN权限。
MySQL 默认的 max_prepared_transactions=0,意味着禁用 XA 事务准备状态持久化 —— 这会导致 XA PREPARE 失败并报错 ERROR 1399 (XAE09): XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state 或直接拒绝执行。
my.cnf(Linux)或 my.ini(Windows)的 [mysqld] 段中显式设置,例如:max_prepared_transactions=128
SET GLOBAL 动态修改无效MySQL 5.7.10+ 中 innodb_support_xa 系统变量已被移除,InnoDB 始终启用 XA 支持 —— 只要使用 InnoDB 表且满足其他条件,XA START 就能正常工作。
ON 即可;但 5.7.10 及以后版本再设会报错 Unknown system variable 'innodb_support_xa'
SHOW ENGINES,确认 InnoDB 行的 XA 列为 YES
XA START 会静默失败或报错 XAER_NOTA
文档里常提“XA 需串行化隔离级别”,这是误解。MySQL XA 事务实际依赖的是 InnoDB 的行锁与 prepare 日志机制,而非会话级隔离级别。
transaction-isolation=REPEATABLE-READ(默认)完全支持 XA,无需改成 SERIALIZABLE
SERIALIZABLE 反而可能因间隙锁加剧阻塞,降低并发度log_bin=ON)、是否启用 innodb_flush_log_at_trx_commit=1(保证 prepare 日志落盘)执行 XA RECOVER 查看悬挂事务时,普通账号常报错:ERROR 1401 (XAE03): XAER_RMERR: fatal error occurred...,本质是权限不足。
XA_RECOVER_ADMIN 权限(MySQL 8.0.29+)或旧版的 PROCESS 权限GRANT XA_RECOVER_ADMIN ON *.* TO 'user'@'host';
GRANT ALL 自动包含,必须显式赋予XA 的核心约束不在配置项数量,而在 prepare 状态必须能被持久化且可被跨会话查询 —— 所以 max_prepared_transactions 和 XA_RECOVER_ADMIN 是唯二绕不开的硬门槛。其他所谓“必须配置”多是过时文档遗留的误导。