最近公司项目需要用到分布式事务,简单了解后,准备接入seata事务,但在对接的过程中报了错。
大致思路:一个用户表、一个用户附加信息表,两个表在不同库,在新增用户中需要同时新增用户附加信息,这个时候就涉及到分布式事务。
在调用新增用户接口时,报错
Caused by: io.seata.common.loader.EnhancedServiceNotFoundException: not found service provider for : io.seata.sqlparser.druid.SQLOperateRecognizerHolder
这个大致是没有找到服务的意思。
seata不支持sqlserver
1.先搜索这个异常信息:EnhancedServiceNotFoundException
2.再次打上断点,调试,可以看到如下图示,进入了我们所在断点位置
3.直接点击下方debugger窗口下的代码运行流程,往下看依次调用了哪些方法,可以看到,第二个步骤是直接抛出了本次异常,继续往下看。
4.这个是去获取指定的扩展类,似乎问题就出在这里了,点进方法进去看下
5.可以看到,这个nameToDefinitionsMap里的值,只有三个,没有我所需要的sqlserver,这个是一个无法改变的常量,在服务启动时就已经加载。问题就出在这里,我项目所需要的是sqlserver数据库,而seata服务里配置的是mysql数据库,这里就需要去把这个变量加上sqlserver,但这是源码包里的,暂时无方法解决。
将nameToDefinitionsMap变量配置上sqlserver,因为涉及到源码,暂时无解决方案,不过知道问题出在哪儿,就有地方下手解决了,后续解决了,会提供上完整的解决方案步骤。
刚开始遇到这个bug的时候,我依然如往常一样,复制错误信息,准备到网上查找,但搜索到的全都无法解决我所遇到的问题。最后,去请教了公司的一个大佬,他的排查过程就像是给我混乱的大脑的一记响钟,让我从以往那种不明不白的状态有了一丝清晰的思路。以往我都不敢去接触这种底层的代码,现在我对这种跟踪排查有了新的认识。