【问题标题】:Load-time weaving (AspectJ): Hystrix breaks transaction propagation加载时编织(AspectJ):Hystrix 中断事务传播
【发布时间】:2019-12-04 15:12:53
【问题描述】:

@EnableLoadTimeWeaving 与 AspectJ + @Transactional + @HystrixCommand 的组合出现问题。

所以,我已经像这样配置了加载时编织:

@EnableLoadTimeWeaving(aspectjWeaving = ENABLED)
@EnableCaching(mode = AdviceMode.ASPECTJ)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)

加上仪器配置。

我有一个bean A,用@Transactional 注释,其中的方法用@HystrixCommand 注释。

然后我有一个bean B,也用@Transactional 注释,但是有propagation = Propagation.MANDATORY,这意味着它需要现有的事务,否则会失败。这个bean中还有一个方法,用@HystrixCommand注解。

最终,当我从 bean A 的方法中调用 bean B 的方法时,我得到:No existing transaction found for transaction marked with propagation 'mandatory'

我花了几个小时寻找问题:一切似乎都配置正确,所以我几乎放弃了。然后我只是试图从方法中删除@HystrixCommand。瞧:事务传播开始正常工作,异常消失了。

所以我想知道:为什么@HystrixCommand 会破坏事务传播?它是否与我使用加载时编织的事实有关?还是预期的行为?有人能解释一下吗?

【问题讨论】:

  • 我是一个 AspectJ 专家,但是一个 Spring 菜鸟,不知道 Hystrix 是什么。也许多几双眼睛会有所帮助,但我担心,GitHub 上的MCVE 是必要的。您的解释很好,可能是正确的,但我无法构建、运行和调试它.... ;-)
  • 感谢您的评论。我正要开始起草 MCVE,Michiel 回答时是这样的:Spring 的@Transactional 不支持多线程,这是由@HystrixCommand 带来的。所以这里与编织或 AspectJ 无关:)

标签: java spring transactions aspectj hystrix


【解决方案1】:

您所说的问题可能与HystrixCommands 在隔离的thread 中执行的事实有关:

默认和推荐设置是使用线程隔离 (THREAD) 运行 HystrixCommands,使用信号量隔离 (SEMAPHORE) 运行 HystrixObservableCommands。

在线程中执行的命令具有额外的保护层,可防止超出网络超时所能提供的延迟。

通常,您应该对 HystrixCommands 使用信号量隔离的唯一时间是当调用量非常大(每个实例每秒数百次)以至于单独线程的开销太高时;这通常只适用于非网络调用。

【讨论】:

  • 这……很有意义。谢谢!
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多