Spring Data JPA - 更新并发访问的 "Total" 字段的最佳方式

Spring Data JPA - Best Way to Update Concurrently Accessed "Total" Field

(使用 Spring Boot 2.3.3 w/ MySQL 8.0。)

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

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

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

  2. 有一个专门的查询,本质上是做类似 UPDATE Account SET total = total + x 的事情作为交易的一部分吗?我假设在这种情况下我仍然需要相同的悲观锁来进行 UPDATE 查询,例如通过 @Query@Lock.

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

对这个基本问题表示歉意,但是,我已经有一段时间不担心在 Spring 中做这样的事情了。

提前致谢!

在进一步练习我的 Google 赋值并深入挖掘之后,似乎已经有人问过这个问题的变体,至少就 'locking' 部分而言是这样。

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

至于重试,重试似乎是可行的方法,但当然要根据情况进行多次重试。

希望这对将来像我一样有脑痉挛的其他人有所帮助。