WITH(NOLOCK)vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

有人可以给我一些关于何时使用WITH (NOLOCK) ,而不是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

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

他们是一样的东西。 如果使用set transaction isolation level语句,则它将应用于连接中的所有表,因此如果您只需要在一个或两个表上使用nolock , 否则使用其他。

两者都会给你脏读。 如果你没事的话,就用它们。 如果您不能读取脏数据,请考虑snapshot或可serializable提示。

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

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

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

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

至于指导方针…从StackOverflow和电网间随机search…

  • NOLOCK(SQL Server提示)不好的做法?
  • 什么时候适合使用NOLOCK?
  • 摆脱那些NOLOCK提示…

据我所知,唯一的区别就是Strommy所说的效果范围。 NOLOCK提示在会议桌上,READ UNCOMMITTED。

至于可能发生的问题,一切都是一致的。 如果你在乎,那么请注意,你可能会得到所谓的脏读,这可能会影响其他数据在不正确的信息上操纵。

我个人并不认为我从中看到过任何问题,但可能更多的是由于我如何使用nolock。 你需要知道,有些情况下可以使用。 大多数情况下,您需要将新数据添加到表中,但有另一个进程在后面检查数据scheme。 这可能是好的,因为主stream不包括在读取期间返回和更新行。

另外我相信现在你应该考虑多版本并发控制。 我相信他们在2005年增加了它,它有助于阻止作者阻止读者通过给读者使用数据库的快照。 我将包括一个链接,并给读者留下进一步的研究:

MVCC

数据库隔离级别

你不能在视图中使用设置事务隔离级别读取未提交(实际上你只能有一个脚本),所以如果应该包含脏行,你将不得不使用(nolock)。

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

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

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