谁能解释一下在查询中使用with (nolock)的含义,什么时候应该/不应该使用它?
例如,如果你有一个银行应用程序,有很高的事务率,在某些表中有很多数据,在什么类型的查询中nolock是可以的?在某些情况下,你是否应该总是使用它/永远不要使用它?
谁能解释一下在查询中使用with (nolock)的含义,什么时候应该/不应该使用它?
例如,如果你有一个银行应用程序,有很高的事务率,在某些表中有很多数据,在什么类型的查询中nolock是可以的?在某些情况下,你是否应该总是使用它/永远不要使用它?
当前回答
我使用with (nolock)提示,特别是在SQLServer 2000数据库的高活动。我不确定在SQL Server 2005中是否需要它。我最近应客户端的DBA的请求在SQL Server 2000中添加了这个提示,因为他注意到有很多SPID记录锁。
我所能说的是,使用提示并没有伤害我们,似乎已经使锁定问题解决自己。那个特定客户的DBA坚持让我们使用这个提示。
顺便说一下,我处理的数据库是企业医疗索赔系统的后端,因此我们谈论的是许多连接中的数百万条记录和20多个表。我通常为连接中的每个表添加WITH (nolock)提示(除非它是派生表,在这种情况下,您不能使用该特定提示)
其他回答
当你可以接受“脏”数据时使用nolock。这意味着nolock也可以读取正在修改的数据和/或未提交的数据。
在高事务处理环境中使用它通常不是一个好主意,这就是为什么它不是查询的默认选项。
我过去常常检索“下一批”要做的事情。在这种情况下,具体是哪个项目并不重要,我有很多用户运行相同的查询。
简单的答案-当你的SQL没有改变数据时,你有一个可能干扰其他活动的查询(通过锁定)。
对于用于报告的任何查询,都值得考虑,特别是当查询花费的时间超过1秒时。
如果您有针对OLTP数据库运行的olap类型的报告,那么它尤其有用。
第一个要问的问题是“我为什么要担心这个?”根据我的经验,当人们处于“尝试任何东西”模式时,通常会出现捏造默认锁定行为,而这种情况下意外的结果并非不可能发生。通常情况下,这是一个过早优化的情况,并且很容易嵌入到应用程序中“以防万一”。重要的是要了解你为什么要这样做,它解决了什么问题,以及你是否真的有问题。
我的2分——当你需要生成报告时,使用WITH (NOLOCK)是有意义的。在这一点上,数据不会有太大的变化&你不会想要锁定这些记录。
不幸的是,这不仅仅是读取未提交的数据。在后台,您可能会读两次页面(在页面分割的情况下),或者您可能会完全错过这些页面。所以你的结果可能是严重扭曲的。
看看Itzik Ben-Gan的文章。以下是节选:
" With the NOLOCK hint (or setting the isolation level of the session to READ UNCOMMITTED) you tell SQL Server that you don't expect consistency, so there are no guarantees. Bear in mind though that "inconsistent data" does not only mean that you might see uncommitted changes that were later rolled back, or data changes in an intermediate state of the transaction. It also means that in a simple query that scans all table/index data SQL Server may lose the scan position, or you might end up getting the same row twice. "