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

Spring JPA存储库锁定混淆

席俊
2023-03-14

我对Spring JPA存储库的锁定方式有一些困惑,需要对其进行一些澄清。

所以,我有一个Spring Boot服务,其中我使用hibernate与数据库交互。在其中一个服务中,我有这样一个实体:-

    @Entity
    @Table(name="JUNIPER_SCH_CURRENT_JOB_DETAIL", schema="juniperx")
    public class JuniperSchCurrentJobDetail {

    private int currentJobSequence;

        ......

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    @Column(name="CURRENT_JOB_SEQUENCE")
    public int getCurrentJobSequence() {
    return currentJobSequence;
    }
    public void setCurrentJobSequence(int currentJobSequence) {
    this.currentJobSequence = currentJobSequence;
    }
    .......

现在,我在上面有一个标记为@repository的存储库,并扩展了JPARepository,如下所示:

   @Repository
   public interface JuniperSchCurrentJobDetailRepository extends 
   JpaRepository<JuniperSchCurrentJobDetail, String> {

   @Query
   public List<Object[]> findLastRunJobDetail(@Param("projectId") 
    String projectId);

所以,令人困惑的是,我的一位同事告诉我不要对这个表使用@Repository和@Entity,因为所引用的表具有很高的插入率和来自其他应用程序的更新率。使用JPA存储库将锁定此表并导致问题。

所以我的问题是:-

1) 在这个微服务中,我只对这个表使用select查询,所以select查询也会锁定这个表吗?

2) 从我读到的信息来看,如果使用乐观锁,它将仅在提交事务时启用锁,但由于此微服务仅读取数据,它还会影响在此表中进行插入和更新的其他服务吗?

3) 如果锁定部分正确,是否有任何方法停止锁定?

4) 我可以在这个微服务中读取脏数据,因为它是用来填充非实时仪表板的,所以继续使用@repository可以吗,还是应该将其更改为JDBC模板以避免锁定问题?

5) 用@NoRepositoryBean注释类和创建只读存储库会有帮助吗?

共有1个答案

赵征
2023-03-14

select查询是否也会锁定此表?

此微服务仅读取数据,它还会影响在此表中进行插入和更新的其他服务吗?

某些数据库在读取表时会在表上创建锁。

然而,这完全独立于JPA,并且高度特定于数据库。您需要查看正在使用的特定数据库,以了解其行为。

写入通常会创建锁,至少对于正在写入的行是这样,对于通过外键引用的行也是这样。某些数据库锁定的行可能比实际写入的行多。

同样,如果您使用JPA、JDBC或您选择的任何SQL工具,情况也是如此。

从我读到的信息来看,如果我使用乐观锁,它将仅在提交事务时启用锁

不,乐观锁定不会创建除上述锁定之外的任何其他(阻塞)锁定。但在读写行之间发生另一次更新时,可能会使更新失败。实际上,乐观锁定的目的是防止更新丢失,而不阻止写入(可能还有读取)。

总之,我看不出JPA在其默认配置中如何比使用JdbcTemplate等更低级的东西生成更多锁。

 类似资料:
  • 正在获取以下异常 Java语言lang.RuntimeException:启动组织时出错。neo4j。内核位于组织的EmbeddedGraphDatabase。neo4j。内核InternalAbstractGraphDatabase。在org上运行(InternalAbstractGraphDatabase.java:335)。neo4j。内核EmbeddedGraphDatabase。(Emb

  • 在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS

  • 我对关系如何在实体中工作以及这对我的JPA存储库意味着什么感到困惑。 我有一个名为Loan的类,它为每个贷款存储一个专辑列表。 我有一个贷款库和一个专辑库。当我启动应用程序时,相册存储库中充满了相册。该专辑是自动生成的。 我也很困惑为什么专辑必须引用带有ManyToOne注释的贷款。为什么相册必须提到贷款? 我大多习惯于关系数据库,所以也许我在以错误的方式思考事情。如果我只能添加新的专辑到贷款,那

  • 我在学习K K 当一个方法从同步块中执行代码时,代码被称为在同步上下文中执行。当您同步一个方法时,用于调用该方法的对象是必须获取其锁的对象。但是当我们同步代码块时,您必须指定要使用哪个对象的锁作为锁。 在本例中,会在AccountDanger实例或Account对象上获取锁吗?我想应该是这样的。我感觉正确吗?如果它是AccountDanger对象,并且一个线程已获得AccountDanger锁,那

  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 搜索仓库和镜像 你可以使用 Docker 来搜索所有公开可用的仓库和镜像。 $ docker search ubuntu 这将通过 Docker 提供的关键字匹配来显示您可用的仓库列表。 私有仓库将不会显示到仓库搜索结果上。你可以通过 Docker Hub 的简况页面来查看仓库的状态。 仓库 你的 Docker Hub 仓库有许多特性。 stars 你的仓库可以用星被标记,你也可以用星标记别的仓