又NPE了?别慌,可能是seata的问题

上周改了一个小bug,在开发环境自验之后,就发布了st,自信走测试回归。然后测试回归的时候却出问题了,抛出了个NPE,在群里疯狂艾特我,我麻溜上服务器看了日志,没想到居然是seata的问题。一阵搜索,总算找到问题的原因,居然不是自身代码问题,而是seata一个issue。

issue链接:https://github.com/seata/seata/issues/3330
问题出现的场景:AT模式下,在进行insert前,修改表结构,添加一列字段,就会导致NullPointerException,大概等到十分钟后会正常,不再报错,
将seata.client.rm.able-meta-check-enable改为true之后,还是会有1分钟的延迟,或者重启clinet,但是正式环境下重启服务不太现实。

复现步骤:
在使用了seata注释逻辑操作的表内
1.先插入一条数据
2.数据库中添加一个字段
3.再次插入一条数据

问题原因
因为分布式事务的实现机制,seata缓存了表结构,而在你变更了表结构后,seata不能及时更新他的表结构,导致NPE。

最后解决
可以参考这个pr
https://github.com/seata/seata/pull/3318/commits/142225229a76b1f06c9a6313a26c984032db2e05

最后seata团队在代码中加了一个配置可以自己配置,seata检查表结构的时间,同时也加上了一个开关,就是是否需要配置这个时间,之前的默认时间是60s。有意思的,大家关于这个配置的默认值还有一些讨论,大部分还是认为线上对表机构的修改较少,认为默认false是足够的。所以如果大家如果toc的系统 有用到seata,上线还有表结构修改的情况可要注意哦。

你可能感兴趣的:(又NPE了?别慌,可能是seata的问题)