Hystrix超时不会在spring boot中回滚事务

问题描述 投票:0回答:1

我正在尝试使用@Transactional在spring boot中的方法上实现hystrix。

@Transactional(transactionManager="primaryTrnsManager")
@HystrixCommand(commandKey ="createRecord", fallbackMethod="createRecordFallback", commandProperties={
@HystrixProperty(name="execution.siolation.thread.timeoutInMilliseconds",value="1000"),
@HystrixProperty(name="circuitBreaker.requestVoulumeThreshold",value="20"),
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="5000"),
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="50")})
public String createRecord(String name){
...............
//Dbcall
}
@Transactional(transactionManager="backUptranManager",propagation=propagation.REQUIRES_NEW)
public String createRecordFallback(){
//dbcall

}

发生什么事情是当hystrix超时发生时,我对数据库进行的调用没有得到回滚,而hystrix正在回退到次要并再次使用相同的sql查询调用数据库。如果超时,我想中止上一个事务并启动另一个事务。通常@Transactional会这样做但是使用hystrix,我会插入dubplicate记录。

任何帮助?

spring-boot timeout transactional hystrix
1个回答
0
投票

发生这种情况是因为HistryxCommand是在一个完全不同的线程中运行的,因此,当“Histryx Admin Thread”(正在监视命令线程的那个)达到超时时,它会标记命令线程被中断,但是内部发生了什么。它不能由Hyxtrix管理。

因此,达到所需行为的最佳方法是设置事务的超时或甚至是jdbc库级别,因此,超时将从命令线程内部进行管理,如果超出,则超时异常将从命令线程内部抛出,Hyxtrix将正确管理它。

© www.soinside.com 2019 - 2024. All rights reserved.