[英]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
字段的任何更新都在最近的值上完成。
在这样的交易中哪个是更好的选择:
使用PESSIMISTIC_WRITE
锁,获取master account ,增加total字段,并提交事务。 或者,
有一个专门的查询,它本质上是做类似的事情, 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.