【问题标题】:Spring Data JPA - Best Way to Update Concurrently Accessed "Total" FieldSpring Data JPA - 更新并发访问的“总”字段的最佳方式
【发布时间】:2020-09-25 02:44:54
【问题描述】:

(使用带有 MySQL 8.0 的 Spring Boot 2.3.3。)

假设我有一个包含total 字段的Account 实体,其中一个帐户实体代表某种主帐户。 IE。 主账户total 字段几乎在每笔交易中都会更新,重要的是,对该total 字段的任何更新都是在最近的值上完成的。

在这样的交易中哪个是更好的选择:

  1. 使用PESSIMISTIC_WRITE 锁,获取主账户,增加total 字段,然后提交事务。或者,

  2. 是否有一个专门的查询,该查询本质上是像 UPDATE Account SET total = total + x 这样的交易的一部分?我假设在这种情况下对于 UPDATE 查询我仍然需要相同的悲观锁,例如通过@Query@Lock

此外,由于锁定获取超时(或其他基于锁定的异常)而重试失败的事务一定次数是一种反模式吗?还是让它失败,报告给客户端,让客户端再次尝试调用事务/服务更好?

为这个基本问题道歉,但是,我已经有一段时间没有担心在 Spring 中做这样的事情了。

提前致谢!

【问题讨论】:

    标签: mysql spring spring-boot spring-data-jpa pessimistic-locking


    【解决方案1】:

    在更多地使用我的 Google Fu 并深入挖掘之后,似乎已经提出了这个问题的变体,至少就“锁定”部分而言。

    也就是说,虽然 Spring Data JPA 文档提到重新声明存储库方法并添加 @Lock 注释,但它似乎只适用于只读查询。这是我最初的想法,因为除非 JPQL 查询发生了一些额外的魔法,否则“锁定”UPDATE 查询没有多大意义。

    至于重试,重试似乎是要走的路,但当然使用对情况有意义的重试次数。

    希望这对将来像我一样患有脑抽筋的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2016-07-21
      • 2015-05-25
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多