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
字段的任何更新都是根据最新值完成的。
在这样的交易中哪个是更好的选择:
使用PESSIMISTIC_WRITE
锁,获取主账户,增加总计字段,然后提交事务。或者,
有一个专门的查询,本质上是做类似 UPDATE Account SET total = total + x
的事情作为交易的一部分吗?我假设在这种情况下我仍然需要相同的悲观锁来进行 UPDATE 查询,例如通过 @Query
和 @Lock
.
此外,由于锁获取超时(或其他基于锁的异常),将失败的事务重试一定次数是否是一种反模式?还是让它失败,报告给客户端,让客户端再次尝试调用 transaction/service 更好?
对这个基本问题表示歉意,但是,我已经有一段时间不担心在 Spring 中做这样的事情了。
提前致谢!
在进一步练习我的 Google 赋值并深入挖掘之后,似乎已经有人问过这个问题的变体,至少就 'locking' 部分而言是这样。
也就是说,虽然 Spring Data JPA 文档提到重新声明存储库方法并添加 @Lock 注释,但它似乎仅适用于只读查询。这是我最初的想法,因为除非 JPQL 查询发生一些额外的魔法,否则“锁定”更新查询没有多大意义。
至于重试,重试似乎是可行的方法,但当然要根据情况进行多次重试。
希望这对将来像我一样有脑痉挛的其他人有所帮助。
(使用 Spring Boot 2.3.3 w/ MySQL 8.0。)
假设我有一个包含 total
字段的 Account
实体,其中一个帐户实体代表某种 主帐户 。 IE。 主账户 的 total
字段几乎在每笔交易中都会更新,重要的是 total
字段的任何更新都是根据最新值完成的。
在这样的交易中哪个是更好的选择:
使用
PESSIMISTIC_WRITE
锁,获取主账户,增加总计字段,然后提交事务。或者,有一个专门的查询,本质上是做类似
UPDATE Account SET total = total + x
的事情作为交易的一部分吗?我假设在这种情况下我仍然需要相同的悲观锁来进行 UPDATE 查询,例如通过@Query
和@Lock
.
此外,由于锁获取超时(或其他基于锁的异常),将失败的事务重试一定次数是否是一种反模式?还是让它失败,报告给客户端,让客户端再次尝试调用 transaction/service 更好?
对这个基本问题表示歉意,但是,我已经有一段时间不担心在 Spring 中做这样的事情了。
提前致谢!
在进一步练习我的 Google 赋值并深入挖掘之后,似乎已经有人问过这个问题的变体,至少就 'locking' 部分而言是这样。
也就是说,虽然 Spring Data JPA 文档提到重新声明存储库方法并添加 @Lock 注释,但它似乎仅适用于只读查询。这是我最初的想法,因为除非 JPQL 查询发生一些额外的魔法,否则“锁定”更新查询没有多大意义。
至于重试,重试似乎是可行的方法,但当然要根据情况进行多次重试。
希望这对将来像我一样有脑痉挛的其他人有所帮助。