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)的决定的利弊。