[seata]MySQL启动xa分支事务失败,failed to start xa branch

2024-01-04 492 views
2

背景:由于seata目前不支持ipv6,因此我们尝试支持ipv6,主要修改的就是解析server ip地址部分,兼容之后saga事务测试没问题,但是测试xa事务时,发现该问题,相关信息如下:

事务模式:xa事务 数据库:MySQL xid:2409:8900:2bb0:5403:b484:9028:fafb:986a%en0:8091:1459581277161279489(该xid是在ipv6环境下生成的)

通过debug跟踪,最终在MySQL中执行的命令为:XA START 0x323430393a383930303a323734303a6331393a643162323a313938383a636634323a3637633325656e303a383039313a36313838333630353233303233353835323831,0x2d36313838333630353233303233353835323833,0x2618

可以看到其中有一个0x2618部分,和报错日志中的描述能对应上。错误日志如下: Caused by: java.sql.SQLException: failed to start xa branch 2409:8900:2bb0:5403:b484:9028:fafb:986a%en0:8091:1459581277161279489 since Undetermined error occurred in the underlying Connection - check your data for consistency

Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0x2618' at line 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:763) at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:648) at com.mysql.cj.jdbc.MysqlXAConnection.dispatchCommand(MysqlXAConnection.java:323)

为了寻找原因,我又跟踪了下ipv4环境下的执行情况,在ipv4环境下时,生成的xid为192.168.55.4:8091:8584275567401013525-8584275567401013527,经过MySQL的拼接和转换,最终在MySQL中执行的命令为 XA START 0x3139322e3136382e35352e343a383039313a38353834323735353637343031303133353235,0x2d38353834323735353637343031303133353237,0x2618

此时ipv4对应的这个XA START 命令是可以正常执行的,通过观察,ipv6的XA START命令和ipv4的XA START命令格式都是一样的,但是通过java.sql.Statement#execute(java.lang.String)方法执行命令时,ipv4的XA START命令能正常执行,而ipv6的XA START命令执行报语法错误,有点不解,希望大佬指点

回答

5

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0x2618' at line 1

6

ipv4下到mysql的xid是这样的,自行xa recover看下长什么样,这个错误明显是mysql提示的,你往里面start的xid不符合他的规范 image

2

ipv4的xid我看了,格式和图片中的一样,但是在ipv6的情况下,执行xa recover后看不到任何信息,我猜测是因为XA START没执行成功,所以xa recover才查不到信息。

8

肯定是没成功报错了, 自行通过命令行进mysql xa start xid测试下,理论上你ipv6不应该有%这种出现,应该类似2001:0db8:85a3:0000:0000:8a2e:0370:7334 (网上随便找的),符号应该只有:一种

0

感谢提供思路,当时为了确保ipv6地址的完整性,就将区域标识符也加上去了,很有可能就是这个区域标识符导致的,我验证下,感谢

4

经过验证,就是ipv6区域标识符导致的,去掉%en0就可以了,问题已解决,感谢