背景:由于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命令执行报语法错误,有点不解,希望大佬指点