做一次真实的两阶段提交,故意在PREPARE之后关闭连接,看一个全新的、从未参与过这个事务的连接,能不能真实找到并完成它。
连接①XA START 'xa_demo'; UPDATE accounts SET balance=balance-50 WHERE id=10; XA END 'xa_demo'; XA PREPARE 'xa_demo'; -- 这条mysql命令执行完就退出了,连接①真实不再存在
SELECT id, balance FROM accounts WHERE id=10; → balance = 1000.00 ← 真实还是原值,PREPARE不等于COMMIT
XA PREPARE只是把这个事务的改动真实写进了redo log、准备好可以提交,但并没有真实提交——这时候连接①已经关闭,可这个"准备好但未提交"的事务真实没有被回滚,它变成了一个悬而未决、等待被处理的状态,独立于任何一个具体连接存在。
XA RECOVER; → formatID=1, gtrid_length=7, data='xa_demo' ← 真实找到了这个悬而未决的事务 XA COMMIT 'xa_demo'; → 真实提交成功 SELECT id, balance FROM accounts WHERE id=10; → balance = 950.00 ← 真实生效了
每一步都是本文上面用真实独立的MySQL连接跑出来的原始结果。
XA START/END/PREPARE/COMMIT + XA RECOVER