谁能解释一下在查询中使用with (nolock)的含义,什么时候应该/不应该使用它?
例如,如果你有一个银行应用程序,有很高的事务率,在某些表中有很多数据,在什么类型的查询中nolock是可以的?在某些情况下,你是否应该总是使用它/永远不要使用它?
谁能解释一下在查询中使用with (nolock)的含义,什么时候应该/不应该使用它?
例如,如果你有一个银行应用程序,有很高的事务率,在某些表中有很多数据,在什么类型的查询中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. "
简单的答案-当你的SQL没有改变数据时,你有一个可能干扰其他活动的查询(通过锁定)。
对于用于报告的任何查询,都值得考虑,特别是当查询花费的时间超过1秒时。
如果您有针对OLTP数据库运行的olap类型的报告,那么它尤其有用。
第一个要问的问题是“我为什么要担心这个?”根据我的经验,当人们处于“尝试任何东西”模式时,通常会出现捏造默认锁定行为,而这种情况下意外的结果并非不可能发生。通常情况下,这是一个过早优化的情况,并且很容易嵌入到应用程序中“以防万一”。重要的是要了解你为什么要这样做,它解决了什么问题,以及你是否真的有问题。
最简单的答案就是一个简单的问题——你需要你的结果是可重复的吗?如果是,那么NOLOCKS在任何情况下都不合适
如果你不需要可重复性,那么nolock可能是有用的,特别是当你不能控制所有连接到目标数据库的进程时。
我过去常常检索“下一批”要做的事情。在这种情况下,具体是哪个项目并不重要,我有很多用户运行相同的查询。
当你可以接受“脏”数据时使用nolock。这意味着nolock也可以读取正在修改的数据和/或未提交的数据。
在高事务处理环境中使用它通常不是一个好主意,这就是为什么它不是查询的默认选项。