NOLOCK与事务隔离级别

20

使用 "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" 和 NOLOCK 有什么区别?它们中哪一个更好?


2
请注意,在MSSQL 2012中,NOLOCK提示已被弃用,将被等效的READUNCOMMITTED提示所取代。来源 - Jeroen
1
建议的来源表示 - “在未来版本的SQL Server中,将删除在UPDATE或DELETE语句的目标表上应用于FROM子句的READUNCOMMITTED和NOLOCK提示的支持。” 它并没有说NOLOCK已被弃用。 我认为当前NOLOCKREADUNCOMMITTED提示都是可用的。 - RBT
4个回答

24

它们是相同的东西,只是作用范围不同。NOLOCK基于每个表设置,而SET Transaction...可以作为一个块放置。


1
在执行的 SQL 中,这是否相当于在所有表中放置 nolock? - Carlos Jaime C. De Leon

6

NOLOCK是一个查询提示,因此仅适用于指定的查询中的特定表。

设置事务隔离级别将应用于当前连接中执行的所有代码,直到明确修改为止。

需要澄清的是,从功能上讲,工作中的隔离级别是相同的,但覆盖的范围可能不同。


5
请看几小时前的这个答案,它回答了关于SQL Server SELECT语句导致阻塞的问题。
引用Remus Rusanu的话:
“SELECT语句可能会阻塞更新操作。一个正确设计的数据模型和查询将只会导致最小的阻塞并且不会成为问题。通常的WITH NOLOCK提示几乎总是错误的答案。正确的答案是调整你的查询使其不扫描大表格。 如果查询无法调整,那么你应该首先考虑使用SNAPSHOT隔离级别,其次你应该考虑使用数据库快照,最后的选择应该是脏读(最好更改隔离级别而不是使用NOLOCK提示)。请注意,如其名所示,脏读将返回不一致的数据(例如,您的总表可能不平衡)。”
其他答案也可能对您有帮助。

仅代表个人观点,这里提供的参考资料并没有回答所提出的问题。 - John Sansom
不完全是,但我认为这可能会有所帮助,因为它将NOLOCK与其他隔离方法进行了比较。 - instanceof me

1

它们有相同的作用,只是一个用作锁提示(nolock),而另一个用于连接范围。

无论哪种方式都要小心 - 根据您的应用程序,脏读可能是非常糟糕的事情。读取相同的记录两次或由于页面移动而错过记录可能会使用户感到非常困惑...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接