繁体   English   中英

Spring Data JPA - 更新并发访问的“总计”字段的最佳方法

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

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

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

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

  1. 使用PESSIMISTIC_WRITE锁,获取master account ,增加total字段,并提交事务。 或者,

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

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

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

提前致谢!

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

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

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

希望这可以帮助将来像我一样脑抽筋的其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM