我正在尝试在Spring Boot的方法上使用@Transactional实现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,我会插入重复的记录。
有帮助吗?
答案 0 :(得分:0)
发生这种情况是因为HistryxCommand在一个完全不同的线程中运行,因此,当“ Histryx Admin Thread”(监视您的命令线程的那个)达到超时时,它会将命令线程标记为中断,但是Hyxtrix无法管理其中发生的事件。
因此,达到所需行为的最佳方法是为事务设置超时,甚至在jdbc库级别设置超时,因此,超时将在命令线程内部进行管理,超时异常将从命令线程内部抛出,Hyxtrix将对其进行正确管理。