多租户seata回滚数据源错误问题

Blade 未结 2 815
mta
mta 剑圣 2021-12-03 17:07

一、该问题的重现步骤是什么?

baldex数据库独立;业务数据库独立,A、B对应业务数据库;

A、B服务启动会根据租户初始化数据;master对应的是bladex,其他是租户数据源;

A、B服务均使用Seata,上下游服务xid已经处理好绑定同一个;

A服务调用B的Feign接口成功,A服务下一步执行报错,A服务回滚成功;B服务走seata的回滚通知,拿到的数据源为master,但是master数据源对应baldex的数据库,其undo_log表并没有业务的信息;真正的业务undo_log信息是在业务数据库里,seata根据xid去baldex数据库找不到回滚信息,默认处理完成,实际上并没能回滚。


二、你期待的结果是什么?实际看到的又是什么?

希望大佬给个较为合适的解决方案,多谢。

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

2.8.1,

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

2条回答
  • 建议你用一个数据源,有访问别的数据库的需求用服务调用的方式。

    作者追问:2021-12-03 17:47

    还有没有更好的方案。

    0 讨论(0)
  • 2021-12-04 00:47

    分布式事务场景,我们开发的准则就是能不用则不用,如果需要,则采用折中的方式,如果折中的方式也不行,再考虑分布式事务。

    你的情况,最好修改设计,如果是动态数据源的情况,就把业务逻辑放到一个服务内,尽可能规避feign调用的场景,否则你还得专门修改底层源码,让seata去识别判断动态数据库的真实名称以次来切换,这样难度相对较高。

    如果服务是固定的数据源,则用分布式事务完全没问题。

    0 讨论(1)
提交回复