本文主要记录项目中所遇的问题,以及查询资料得到的解决方案。
项目环境:
spring-boot:2.2.5.RELEASE
spring-cloud:Hoxton.SR3
txlcn:5.0.2.RELEASE
问题描述:
使用feign调用远程方法并开启熔断,熔断开启后txlcn的回滚失效,发起方A通过feign调用参与方B(删除操作)、C(添加操作),其中B发生异常能正常回滚,C无异常直接正常执行不参与回滚
事务发起方有关配置如下:
spring:
application:
name: item-show
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://#:3306/microservice
username: #
password: #
hystrix:
command:
default:
execution:
isolation:
# 调用隔离方式,默认采用线程隔离,默认是Thread, 可选Thread|Semaphore,由于LCN使用线程池隔离策略时出现过隐患故使用信号量
strategy: SEMAPHORE
feign:
hystrix:
enabled: true
server:
port: 8085
tx-lcn:
client:
manager-address: 192.168.3.41:8070
参与方B、C使用mongodb数据库,使用的注解为@TccTransaction,通过cancelMethod自定义业务逻辑实现回滚。
再未启用熔断时,事务能正常回滚。
解决方案:
在Fallback方法执行降级处理的前面加上
DTXUserControls.rollbackGroup(TracingContext.tracing().groupId());如:
public int insert(UserInfo userInfo) {
DTXUserControls.rollbackGroup(TracingContext.tracing().groupId());
return 0;
}