codingapi / tx-lcn

LCN distributed transaction framework, compatible with dubbo, spring cloud and Motan framework, supports various relational databases
https://www.codingapi.com
Apache License 2.0
4.22k stars 1.46k forks source link

openfeign调用,事务不能传递? #566

Closed catman002 closed 3 years ago

catman002 commented 3 years ago

1. Bug Description

我的微服务治理采用的 is ti o,微服务实现框架是 springboot ,但是服务之间调用我才用的 开源openfeign ,发现事务不能传播。如a->b,如果采用openfein,b加入不了a创建的事务组,b的tanscation state是none; 但如果a->b才用的restTemplate,就没问题,正常加入事务组,事务正常出传播。

理论上不应该有这样的问题,找了很长时间,不知道怎么回事,能够帮看看不。

2. Environment:

klboke commented 3 years ago

这样描述没法判断是什么问题,需要 debug 定位

catman002 commented 3 years ago

@klboke 没有bug输出,通过跟踪,是因为b没有发现a 的事务组: public boolean hasGroup() { return Objects.nonNull(fields) && fields.containsKey(TracingConstants.GROUP_ID) && StringUtils.hasText(fields.get(TracingConstants.GROUP_ID)); } b服务在被调用后,拦截器执行在执行上面代码的时候,StringUtils.hasText(fields.get(TracingConstants.GROUP_ID))为空!!!! 导致txContext.isDtxStart被设置成true,而 b的事务传播是suppose,所以b没法加入a创建事务组,。。。。。。

但如果a-》b换成 resttemplate调用就不会出现这问题。

klboke commented 3 years ago

那可以把排查的方向放到 openfeign 的事务id传递上

catman002 commented 3 years ago

那可以把排查的方向放到 openfeign 的事务id传递上

需要看哪个文件? 我顺着看看。。。😍

catman002 commented 3 years ago

问题找到了,由于我没有用 springcloud, 是单独用的 openfeign, 所以拦截器没生效,导致事务组id 没有传递。 调用时注入即可!!!