【发布时间】: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