WITH(NOLOCK)vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

时间:2010-08-23 18:05:08

标签: sql sql-server sql-server-2005

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

给我一​​些指导

每个的优点/缺点是什么?是否有任何意外的后果,你使用一个而不是另一个?

6 个答案:

答案 0 :(得分:100)

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

两者都会给你脏读。如果你对此没问题,那就用它们吧。如果您不能进行脏读,请考虑使用snapshotserializable提示。

答案 1 :(得分:25)

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

答案 2 :(得分:10)

  • NOLOCK是表格的本地(或视图等)
  • READ UNCOMMITTED是每个会话/连接

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

答案 3 :(得分:9)

据我所知,唯一的区别在于斯特罗米所说的影响范围。 NOLOCK提示在一个表上,并在会话中解读了READ UNCOMMITTED。

对于可能发生的问题,一切都与一致性有关。如果您在意,那么请注意,您可能会得到所谓的脏读,这可能会影响在错误信息上操作的其他数据。

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

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

MVCC

Database Isolation Levels

答案 4 :(得分:6)

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

答案 5 :(得分:4)

由于必须对每个表使用WITH(NOLOCK),因此在每个FROM或JOIN子句中编写它可能会很烦人。然而,它有一个原因,它被称为“脏”读。因此,您确实应该知道何时执行此操作,而不是将其设置为会话范围的默认值。为什么?

忘记WITH(NOLOCK)可能不会以非常戏剧性的方式影响您的程序,但是在您执行脏读时希望在某些情况下可以有所作为。

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