当前位置: 首页 > 知识库问答 >
问题:

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

宗政坚白
2023-03-14

(使用Spring Boot 2.3.3和MySQL 8.0。)

假设我有一个帐户实体,其中包含一个字段,其中一个帐户实体代表某种主帐户。即该主帐户的字段几乎每笔交易都会更新,对该字段的任何更新都必须针对最近的值进行。

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

> < li>

使用< code >悲观_写入锁,获取主帐户,增加总计字段,并提交事务。或者,

有一个专门的查询,本质上是这样做的,UPDATE帐户SET总=总x作为事务的一部分?我假设在这种情况下,我仍然需要相同的悲观锁用于UPDATE查询,例如通过@Query@Lock

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

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

提前谢谢!

共有1个答案

井宪
2023-03-14

在使用我的Google Fu多做了一点,挖掘得更深之后,似乎这个问题的变体已经被问过了,至少在“锁定”部分是这样的。

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

至于重试,重试似乎是可行的方法,但当然,在这种情况下使用一定数量的重试是有意义的。

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

 类似资料:
  • 问题内容: 我想知道在Java上使用HB更新分离对象的某些字段的最佳方法是什么。特别是当对象具有子对象属性时。例如(删除注释并减少字段数以减少噪声): 在MVC Web 应用程序中更新父级时,我可以使用 Session.get(Parent.class,123) 调用父级实例,使用它来填充表单并显示它。没有DTO,只有分离的父级传递到视图并绑定到表单。现在,我只想允许用户更新父级的 field2

  • 我知道“newInstance”-Pattern(实例化新Android片段的最佳实践)。但是如果另一个片段更改数据,我如何更新片段的这些参数? 我知道片段/活动之间的回调方法,但这些回调不会更新参数?! 例如:在创建片段时,我将URI与包一起传递给它。然后,另一个片段通过对第一个片段的changeUri(URI-URI)方法回调来更改这个URI。如果然后重新创建片段(例如由于屏幕旋转),它将使用

  • 我有一个字段,用于从类继承的建筑物和不同类型建筑物的子类。类有一个名为“”的字段,每次在子类中添加建筑物时,我都要更新该字段。 我希望Buildings类中的始终显示已创建的建筑物的总数。 在这种情况下,我要为“”字段使用“final”关键字吗? 如果在子类“”的对象(即)中调用 ? 它会更新它继承的字段吗? 请帮帮忙。谢谢.

  • 我试图通过Cloud Firestore实时更新访问标记为的字段。 下面是我的数据结构: 以前,在Firebase Realtime Database下,我会。addValueEventListener()并深入到“答案”。然而,有了云Firestore,它就有点复杂了。 应答文档总数。 每个单独的答案

  • 我有几个不同的路由,但包含相似的参数。 示例: 请注意,所有三个视图都使用相同的图表控制器来控制视图。这是一个相当通用的控制器,但它需要在可用的图表类型之间切换。。。同时保持路线的其余部分<示例:(这不起作用) 有人知道如何在不完全重新键入或重建路由路径的情况下轻松更新路由参数吗?

  • 问题内容: 我已经使用.NET创建了数据访问层。在任何更新数据库记录的地方,我都使用sql来实现以下目的: 更新客户设置FirstName =:FirstName,LastName =:LastName,Address1 =:Address1,Address2=:Address2,.... etc 这意味着即使只更改了一个字段,记录中的每个字段也会更新。一位同事对此表示质疑,他说我们仅应在字段已更