在我们正在编写的应用程序中,要求我们在查询中使用with(NOLOCK)
。只是为了使查询不需要花费很长时间即可处理。
关于如何完成此操作,我一无所获。我确实发现了如何启用乐观或悲观锁定,但是据我所知,那是用于写入数据,而不是读取。
有没有办法做到这一点?
我们正在使用JPA和Criteria API连接到MSSQL服务器,而应用程序服务器是Glassfish 4。
费率
with(NOLOCK)
行为非常类似于在READ-UNCOMMITED事务隔离级别中工作,如here所述。鉴于此,您可以通过使用在该事务级别配置的数据库连接来实现所需的功能。如果要在执行期间决定要使用的事务级别,请简单地单击get the underlying connection并更改事务隔离级别(此后,应将其更改回原始级别)。
如果您将with(NOLLOCK)
功能用于其他目标以避免某些错误,则必须为此编写本机查询。
您的任务的正确解决方案是使用乐观锁定,默认情况下,该锁定在主要JPA提供程序中启用。简而言之:您无需做任何操作即可在不锁定的情况下从数据库读取数据。另一方面,启用悲观模式时,JPA通过数据库行锁定机制(通常)将整个表行锁定。有关更多信息,请查看link
等效于WITH(NOLOCK)] >>将使用READ_UNCOMMITTED隔离级别。
@Transactional(isolation = Isolation.READ_UNCOMMITTED)