java– 使用Transactional进行Spring重试

java– 使用Transactional进行Spring重试,第1张

概述Spring Retry是否可以保证与Spring的@Transactional注释一起使用?具体来说,我正在尝试使用@Retryable进行乐观锁定.似乎它将依赖于创建的AOP代理的顺序.例如,如果调用如下所示:致电代码 - >重试代理 - >交易代理 - >实际数据库代码然后它将正常工作,但如果代理结构如下:致电代码 - >交易代理 - >重试代理 -

Spring Retry是否可以保证与Spring的@Transactional注释一起使用?

具体来说,我正在尝试使用@Retryable进行乐观锁定.似乎它将依赖于创建的AOP代理的顺序.例如,如果调用如下所示:

致电代码 – >重试代理 – >交易代理 – >实际数据库代码

然后它将正常工作,但如果代理结构如下:

致电代码 – >交易代理 – >重试代理 – >实际数据库代码

然后重试将不起作用,因为关闭事务的行为是抛出optmistic锁定异常的行为.

在测试中,它似乎生成了第一个案例(重试,然后交易),但我不知道这是保证行为还是幸运.

最佳答案如果你想独立测试它并确定它的行为,那么你可能有@Transactional @Service,然后是另一个使用事务一的服务,只是添加了重试.

在这种情况下,无论您测试多少,您都依赖于未记录的行为(如何精确地进行注释处理).这可能会在次要版本之间发生变化,基于创建独立Spring bean的顺序等等.简而言之,当您在同一方法上混合@Transactional和@Retry时,您会遇到问题.

编辑:有类似的答案问题https://stackoverflow.com/a/45514794/1849837与代码

@Retryable(StaleStateException.class)@Transactionalpublic voID doSomethingWithFoo(Long fooID){    // read your entity again before changes!    Foo foo = fooRepository.findOne(fooID);    foo.setStatus(REJECTED)  // <- sample foo modification} // commit on method end

在这种情况下,似乎没问题,因为无论什么顺序(重试然后交易,或交易或重试),可观察行为都是相同的. 总结

以上是内存溢出为你收集整理的java – 使用Transactional进行Spring重试全部内容,希望文章能够帮你解决java – 使用Transactional进行Spring重试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存