【问题标题】:JPA reading data with NO LOCKJPA 无锁读取数据
【发布时间】:2015-05-19 13:56:43
【问题描述】:

在我们正在编写的应用程序中,我们需要在查询中使用with(NOLOCK)。只是这样查询不会花费很长时间来处理。

我还没有找到有关如何完成此操作的任何信息。我确实发现了如何启用乐观或悲观锁定,但据我所知,这是用于写入数据,而不是读取。

有没有办法做到这一点?

我们使用 JPA 和 Criteria API 连接到 MSSQL 服务器,应用服务器是 Glassfish 4。

消耗

【问题讨论】:

    标签: sql sql-server jakarta-ee jpa criteria-api


    【解决方案1】:

    相当于JPA中的WITH (NOLOCK)是使用READ_UNCOMMITTED隔离级别。

    @Transactional(isolation = Isolation.READ_UNCOMMITTED)
    

    【讨论】:

    • 但是这个在查询中没有'WITH(NO LOCK)',没有生成
    【解决方案2】:

    with(NOLOCK) 行为与在 READ-UNCOMMITED 事务隔离级别中工作非常相似,正如here 所解释的那样。鉴于此,您可以通过使用在该事务级别中配置的数据库连接来实现您想要的。如果您想在执行期间决定使用什么事务级别,只需get the underlying connection 并更改事务隔离级别(之后您应该将其更改回原始级别)。

    如果您将with(NOLLOCK) 功能用于其他目标以避免一些错误,那么您将不得不为此编写本机查询。

    【讨论】:

      【解决方案3】:

      您的任务的正确解决方案是使用乐观锁定,默认情况下在主要 JPA 提供程序中启用。简而言之:您必须在没有锁定的情况下从数据库中读取数据。另一方面,当启用悲观模式时,JPA 通过数据库行锁定机制(通常)提供锁定整个表行。更多信息请查看link

      【讨论】:

      • 所以如果我理解正确,我不能在 JPA 中提供与 TSQL 中的 with (NOLOCK) 相同的行为吗?因为乐观锁定(JPA 中的默认值)仍然锁定它正在读取的行,而 with (NOLOCK) 根本没有锁定?
      • 在我看来,您可以使用乐观锁定模式来做到这一点。但是实现是提供者指定的。您可以通过设置为“true” hibernate.show_sql 属性并使用额外的数据库监视器来“窥视”从休眠到 sql-server 的 sql 查询,然后确保本机数据库锁定或无锁定。当您通过 JPA 工作时,您不必担心某些范例的特定于数据库的实现。
      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2017-11-13
      • 2020-01-31
      • 1970-01-01
      • 2014-11-20
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多