2009-06-19 110 views
17

使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”和NOLOCK之间有什么区别?这个比那个好吗?NOLOCK与事务隔离级别

+2

注意`NOLOCK`暗示在2012 MSSQL过时,用等价`READUNCOMMITTED`提示更换。 [来源](http://msdn.microsoft.com/en-us/library/ms187373.aspx)。 – Jeroen 2013-05-12 14:41:12

+0

建议的源代码表示 - 在FROM子句中支持使用UPDATE或DELETE语句的目标表中的READUNCOMMITTED和NOLOCK提示将在未来的SQL Server版本中删除。 `。它不会说`NOLOCK`已被弃用。目前,我相信`NOLOCK`和`READUNCOMMITTED`提示都可用。 – RBT 2016-08-23 10:52:34

回答

20

它们是相同的东西,只是作用域不同。 NOLOCK放置在每个桌子的基础上,并且可以将SET Transaction...作为块放置。

+0

感谢您的确认! – Jason 2009-06-19 15:48:54

6

NOLOCK是查询提示,因此仅适用于specifc表中被指定它的查询中。

设置事务隔离级别适用于在当前连接内执行的所有代码,或者直到它被明确修改。

为了澄清,在功能上工作isoloation水平是其上覆盖可能并不相同但是范围。

4

that answer从几个小时前,这个问题SQL Server SELECT statements causing blocking

报价Remus Rusanu

SELECT可以阻止更新。正确设计的数据模型和查询只会造成最小的阻塞,而不是问题。 “常用”WITH NOLOCK提示几乎总是错误的答案。正确的答案是调整您的查询,以便它不扫描巨大的表。

如果查询不可执行,那么您应该首先考虑SNAPSHOT ISOLATION级别,其次您应该考虑使用DATABASE SNAPSHOTS并且最后一个选项应该是DIRTY READS(并且最好更改隔离级别而不是使用NOLOCK HINT)。请注意,如名称明确指出的那样,脏读将返回不一致的数据(例如,您的总表可能不平衡)。

其他的答案可以帮助你。

1

它们具有相同的效果,只有一个用作锁提示(NOLOCK),另一个被用于连接范围。

要小心这些 - 脏读取可能是一个非常糟糕的事情取决于您的应用程序。读同一记录两次或因缺少运动页的记录可以是一个非常令人困惑的事情给用户...