apache / incubator-seata

:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.
https://seata.apache.org/
Apache License 2.0
25.38k stars 8.79k forks source link

动态数据源DynamicDataSource通过httpheader指定数据源,发生异常回滚时rm无法拿到指定数据源 #3729

Closed zhangke199338 closed 3 years ago

zhangke199338 commented 3 years ago

我这边项目目前是拦截HttpServletRequest获取header的dbkey 后通过DynamicDataSourceContextHolder.push(dbkey)来指定数据源。异常触发回滚消息是否能设置自定义参数,然后rm client 收到此自定义参数后 往DynamicDataSourceContextHolder存入dbkey 以找到指定数据源

funky-eyes commented 3 years ago

关闭seata自动代理,手动代理DynamicDataSource内部的多个Datasource并放入DynamicDataSource,DynamicDataSource无需代理,只需要暴露成一个bean即可

zhangke199338 commented 3 years ago

关闭seata自动代理,手动代理DynamicDataSource内部的多个Datasource并放入DynamicDataSource,DynamicDataSource无需代理,只需要暴露成一个bean即可

@a364176773 可能我描述的不够清晰 ,数据源由请求头决定,然后会传递到各个微服务,用HandlerInterceptorAdapter拦截并调用DynamicDataSourceContextHolder.push(dbkey) 来指定数据源,dao层接口都不会有@DS注解,全靠请求头信息来路由,所以当发生回滚时,会一直报Branch session rollback failed and try again later xid = 192.168.104.26:8091:18147060501060324 branchId = 18147060501060326 dynamic-datasource can not find primary datasource,因为DynamicDataSourceContextHolder.peek()为空就直接拿配置文件指定的spring.datasource.dynamic.primary,由于目前这个没有配置所以默认拿了mater,而这个ds是不存在的,即使存在也有可能拿到与请求头不一致的datasource,因为请求头告诉的数据源不一定和spring.datasource.dynamic.primary相等

ybb007 commented 1 year ago

老哥,这问题现在解决了没有啊?我也遇到了