WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Posted

技术标签:

【中文标题】WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED【英文标题】: 【发布时间】:2010-08-23 18:05:07 【问题描述】:

有人可以指导我何时应该使用WITH (NOLOCK) 而不是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

各自的优缺点是什么?使用其中一种而不是另一种时,您是否会遇到任何意想不到的后果?

【问题讨论】:

【参考方案1】:

它们是一样的。如果您使用set transaction isolation level 语句,它将适用于连接中的所有表,因此如果您只想在一个或两个表上使用nolock,请使用它;否则使用另一个。

两者都会给您带来脏读。如果您对此感到满意,请使用它们。如果您不能进行脏读,请考虑使用snapshotserializable 提示。

【讨论】:

如果您不关心虚拟数据,请考虑使用 REPEATABLE READ 而不是 SERIALIZABLESERIALIZABLE 确实具有限制性,几乎不应该使用(在某些关键的金融应用程序中除外)。【参考方案2】:

WITH (NOLOCK) 是表级别的提示。将事务隔离级别设置为 READ_UNCOMMITTED 会影响连接。区别在于范围。请参阅此处 SQL Server 文档中的 READUNCOMMITTED 和 NOLOCK:

http://technet.microsoft.com/en-us/library/ms187373.aspx

对于交易隔离级别: http://technet.microsoft.com/en-us/library/ms173763.aspx

【讨论】:

【参考方案3】: NOLOCK 是表(或视图等)本地的 READ UNCOMMITTED 是每个会话/连接

至于指南...从 *** 和电子互联网随机搜索...

Is the NOLOCK (Sql Server hint) bad practice? When is it appropriate to use NOLOCK? Get rid of those NOLOCK hints…

【讨论】:

最后一个链接“为什么使用 NOLOCK 不好..”不再存在。 电动互联网是无价的。感谢您为我的一天增添了一些阳光。【参考方案4】:

据我所知,唯一的区别是 Strommy 所说的效果范围。表上的 NOLOCK 提示和会话上的 READ UNCOMMITTED。

至于可能出现的问题,一切都与一致性有关。如果您关心,请注意您可能会获得所谓的脏读,这可能会影响其他数据被错误信息所操纵。

我个人认为我没有看到任何问题,但这可能更多是由于我使用 nolock 的方式。您需要知道在某些情况下可以使用它。您主要向表中添加新数据但后面有另一个进程来检查数据场景的场景。这可能没问题,因为主要流程不包括在读取期间返回和更新行。

另外我相信这些天你应该研究多版本并发控制。我相信他们在 2005 年添加了它,它通过为读者提供要使用的数据库的快照来帮助阻止作者阻止读者。我将包含一个链接并将进一步的研究留给读者:

MVCC

Database Isolation Levels

【讨论】:

+1 虽然我没有进入 READ_UNCOMMITTED 的“你应该”方面,但 Sean 很好地涵盖了这一点。还有一些情况,您可以在 SQL Server 中读取同一行两次(由于页面拆分)。【参考方案5】:

您不能在视图中使用 Set Transaction Isolation Level Read Uncommitted(实际上您只能在其中有一个脚本),因此如果应该包含脏行,则必须使用 (nolock)。

【讨论】:

【参考方案6】:

由于您必须对每个表使用 WITH (NOLOCK),因此在每个 FROM 或 JOIN 子句中编写它可能会很烦人。然而,它被称为“脏”读是有原因的。所以你真的应该知道什么时候做,而不是把它设置为会话范围的默认值。为什么?

忘记 WITH (NOLOCK) 可能不会以非常戏剧性的方式影响您的程序,但是在您确实想要的地方进行脏读可以在某些情况下产生影响。

因此,如果允许当前选择的数据不正确,请使用 WITH (NOLOCK),因为它可能稍后会回滚。这主要用于当您想要提高性能时,并且对应用程序上下文的要求允许它承担显示不一致数据的风险。但是,您或负责人必须权衡决定使用 WITH (NOLOCK) 的利弊。

【讨论】:

以上是关于WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中的“with (nolock)”是啥?

WITH (NOLOCK)

理解with(nolock)(转载)

sqlserver with(nolock)

with(nolock)的用法

Laravel Eloquent 和 Query Builder “with (nolock)”