【问题标题】:Move HTTP calls outside the Transaction in Springboot在 Spring Boot 中将 HTTP 调用移到事务之外
【发布时间】:2020-02-24 11:03:32
【问题描述】:

我们的项目使用 Kotlin 和 springboot 作为框架。 在我们的服务类中,我们有一堆代码,其中在标有@Transactional 的方法中很少有http 调用。

我需要将 http 调用移到事务之外,因为这会产生性能问题。

代码看起来像这样:

@Transactional
Method1() {
   “HTTP Call”
    Saving to DB
    “Call to another service B()”
}

在这个service B 中,我们调用的是Method2()

Method2() {
 Bunch of operations and then it further Saves few objects to DB.
}

所以基本上@Transactional 也负责所有嵌套的数据库操作。

对如何进行此更改有任何建议吗?可以采用哪些不同的策略来实现这一目标?

提前致谢!

【问题讨论】:

  • http调用的结果会影响交易的结果吗?
  • 是的。它是对另一个服务的调用,该服务获取一些记录,然后我们将其保存到数据库中,然后从方法中返回对象。
  • 将保存移至另一种方法(外部服务)使该方法具有事务性,而不使另一个具有事务性。
  • @M.Deinum 我已经更新了我的问题,因为我偶然发现了一些更复杂的东西。所以现在我假设(并且在现实中也应该发生)是,最初当 Method1() 与 @Transactional 一起使用时,它也在处理所有嵌套的 DB 操作,在服务 B 中也是如此。但是,如果我只是将 Saving to DB 从 Method1() 中移出并用 @Transactional 标记这个新方法,它将弄乱我的嵌套数据库操作。
  • 这不是您问题的一部分。所有应该是事务性的都应该在一个方法中。如果那是不可能的,那么就让它保持原样。另外,为什么会出现性能问题? TX 所花费的时间可能只是进行这些 HTTP 调用所花费的时间的一小部分。

标签: spring-boot http kotlin


【解决方案1】:

所以我终于能够解决这个问题。我不得不将我的方法从使用声明式事务管理更改为编程方法。

Method1() {
   “HTTP Call”
    TransactionTemplate.execute() {        // used this for the transaction management.
      Saving to DB
   } 
    “Call to another service B()”
}

然后在服务 B

Method2() {
    “Another http call”
    TransactionTemplate.executewithoutResult(){    // used TransactionTemplate.executewithoutResult because this time I did not want the transaction to return me the result. 
         Saving to DB
   } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2019-06-07
    • 1970-01-01
    • 2021-09-25
    • 2014-11-20
    • 2019-12-09
    • 2020-03-07
    相关资源
    最近更新 更多