JPA读取无锁数据

问题描述 投票:4回答:3

在我们正在编写的应用程序中,要求我们在查询中使用with(NOLOCK)。只是为了使查询不需要花费很长时间即可处理。

关于如何完成此操作,我一无所获。我确实发现了如何启用乐观或悲观锁定,但是据我所知,那是用于写入数据,而不是读取。

有没有办法做到这一点?

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

费率

sql sql-server java-ee jpa criteria-api
3个回答
3
投票

with(NOLOCK)行为非常类似于在READ-UNCOMMITED事务隔离级别中工作,如here所述。鉴于此,您可以通过使用在该事务级别配置的数据库连接来实现所需的功能。如果要在执行期间决定要使用的事务级别,请简单地单击get the underlying connection并更改事务隔离级别(此后,应将其更改回原始级别)。

如果您将with(NOLLOCK)功能用于其他目标以避免某些错误,则必须为此编写本机查询。


0
投票

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


0
投票
JPA中的

等效于WITH(NOLOCK)] >>将使用READ_UNCOMMITTED隔离级别。

@Transactional(isolation = Isolation.READ_UNCOMMITTED)
© www.soinside.com 2019 - 2024. All rights reserved.