使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”和 NOLOCK 有什么区别?这个比那个好吗?
4 回答
它们是相同的东西,只是范围不同。NOLOCK 放置在每个表的基础上,并且SET Transaction...可以作为一个块放置。
NOLOCK 是一个查询提示,因此仅适用于指定它的查询中的特定表。
设置事务隔离级别适用于在当前连接中执行的所有代码,或者直到它被显式修改。
澄清一下,工作中的隔离级别在功能上是相同的,但所涵盖的范围可能不同。
请参阅几个小时前对SQL Server SELECT statements 导致阻塞的问题的答案。
SELECT 可以阻止更新。正确设计的数据模型和查询只会导致最小的阻塞并且不会成为问题。'通常' WITH NOLOCK 提示几乎总是错误的答案。正确的答案是调整您的查询,使其不会扫描巨大的表。
如果查询不可调,那么您应该首先考虑 SNAPSHOT ISOLATION 级别,其次您应该考虑使用 DATABASE SNAPSHOTS,最后一个选项应该是 DIRTY READS(并且最好更改隔离级别而不是使用 NOLOCK HINT)。请注意,脏读,顾名思义,将返回不一致的数据(例如,您的总工作表可能不平衡)。
其他答案也可能对您有所帮助。
它们具有相同的效果,只有一个用作锁定提示(nolock),另一个用作连接范围。
小心其中任何一个 - 脏读可能是一件非常糟糕的事情,具体取决于您的应用程序。由于页面移动而两次读取同一记录或丢失一条记录对于用户来说可能是一件非常令人困惑的事情......