NOLOCK与事务隔离级别

时间:2009-06-19 15:40:46

标签: sql sql-server transaction-isolation

使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”和NOLOCK之间有什么区别?一个比另一个好吗?

4 个答案:

答案 0 :(得分:21)

它们是一样的,只是采用不同的方式。 NOLOCK基于每个表格放置,SET Transaction...可以作为块放置。

答案 1 :(得分:6)

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

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

为了澄清,在功能上,工作中的等级水平是相同的,但涵盖的范围可能不是。

答案 2 :(得分:4)

请参阅几小时前的that answer,问题SQL Server SELECT statements causing blocking

引用Remus Rusanu

  

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

     

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

其他答案也可以为您提供帮助。

答案 3 :(得分:1)

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

要小心其中任何一个 - 根据您的应用程序,脏读取可能是一件非常糟糕的事情。由于页面移动而读取相同的记录两次或丢失记录对用户来说可能是一件非常令人困惑的事情......