谁能解释一下在查询中使用with (nolock)的含义,什么时候应该/不应该使用它?

例如,如果你有一个银行应用程序,有很高的事务率,在某些表中有很多数据,在什么类型的查询中nolock是可以的?在某些情况下,你是否应该总是使用它/永远不要使用它?


当前回答

当你可以接受“脏”数据时使用nolock。这意味着nolock也可以读取正在修改的数据和/或未提交的数据。

在高事务处理环境中使用它通常不是一个好主意,这就是为什么它不是查询的默认选项。

其他回答

不确定为什么没有在数据库事务中包装金融事务(当您将资金从一个帐户转移到另一个帐户时—您不每次提交事务的一方—这就是显式事务存在的原因)。即使您的代码听起来对业务事务来说是脑死亡,但所有事务性数据库都有可能在发生错误或失败时执行隐式回滚。我觉得这个讨论超出了你的理解力。

如果您遇到了锁定问题,请实现版本控制并清理代码。

没有锁不仅返回错误的值,还返回虚记录和副本。

这是一个常见的误解,它总是使查询运行得更快。如果表上没有写锁,也没有什么区别。如果表上有锁,它可能会使查询更快,但最初发明锁是有原因的。

公平地说,这里有两个特殊的场景,nolock提示可以提供实用程序

1) 2005年以前的sql server数据库需要对实时OLTP数据库运行长查询,这可能是唯一的方法

2)写得很糟糕的应用程序,它锁定记录并将控制权返回给UI和阅读器,无限期地阻塞。如果应用程序无法修复(第三方等),数据库是2005年以前或版本无法打开,Nolock可以在这里提供帮助。

当你可以接受“脏”数据时使用nolock。这意味着nolock也可以读取正在修改的数据和/或未提交的数据。

在高事务处理环境中使用它通常不是一个好主意,这就是为什么它不是查询的默认选项。

WITH (NOLOCK)相当于使用READ uncommitted作为事务隔离级别。因此,您可能会读取一个未提交的行,该行随后会被回滚,即从未进入数据库的数据。因此,虽然它可以防止读取被其他操作死锁,但也存在风险。在具有高交易率的银行应用程序中,它可能不是您试图用它解决的任何问题的正确解决方案。

您可以在仅读取数据时使用它,并且并不真正关心是否可能返回尚未提交的数据。

它可以在读取操作上更快,但我不能确切地说快多少。

一般来说,我建议不要使用它——读取未提交的数据最多可能会有点混乱。

我过去常常检索“下一批”要做的事情。在这种情况下,具体是哪个项目并不重要,我有很多用户运行相同的查询。