有人能给我一些指导,什么时候我应该使用 WITH (NOLOCK)而不是 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
WITH (NOLOCK)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
每种方法的优缺点是什么?有没有什么意外后果是你用一种而不是另一种?
WITH(NOLOCK)是表级别的提示。将事务隔离级别设置为 READ _ UNCOMMITTED,以影响连接。区别在于范围。请参阅 SQLServer 文档中的 READUNCOMMITTED 和 NOLOCK:
Http://technet.microsoft.com/en-us/library/ms187373.aspx
事务隔离: Http://technet.microsoft.com/en-us/library/ms173763.aspx
它们是一回事。如果您使用 set transaction isolation level语句,它将应用于连接中的所有表,因此如果您只想在一个或两个表上使用 nolock,则使用该语句; 否则使用另一个。
set transaction isolation level
nolock
两者都会给你带来负面影响。如果你不介意,那就用吧。如果不能进行脏读操作,那么可以考虑使用 snapshot或 serializable提示。
snapshot
serializable
据我所知,唯一不同的是斯特罗米所说的影响范围。表上的 NOLOCK 提示和会话上的 READUNCOMMITTED。
至于可能发生的问题,关键在于一致性。如果您关心这个问题,那么请注意,您可能会得到所谓的脏读操作,这可能会影响其他数据在不正确的信息上被操纵。
我个人认为我没有看到任何问题,但这可能是由于我如何使用 nolock。您需要注意,在某些情况下可以使用它。在这些场景中,您主要是向表中添加新数据,但后面还有另一个进程来检查数据场景。这可能没问题,因为主流不包括在读取期间返回和更新行。
而且我认为现在你应该研究一下多版本并发控制。我相信他们在2005年增加了它,它有助于阻止作者阻止读者通过给读者一个快照的数据库使用。我会附上一个链接,并把进一步的研究留给读者:
MVCC
数据库隔离级别
至于指导方针... 从 StackOverflow 和电子互联网上随机搜索..。
因为必须对每个表使用 WITH(NOLOCK) ,所以在每个 FROM 或 JOIN 子句中都写入 WITH(NOLOCK)可能会很烦人。然而,它有一个理由,为什么它被称为“肮脏”阅读。因此,您真的应该知道什么时候执行,而不是将其设置为会话范围的默认值。为什么?
忘记 WITH (NOLOCK)可能不会对您的程序产生很大的影响,但是在 没有中执行脏读操作会在某些情况下产生不同的结果。
因此,如果允许所选的当前数据不正确,则使用 WITH(NOLOCK) ,因为它可能会在以后回滚。这主要用于您希望提高性能的时候,并且应用程序上下文的要求允许它承担显示不一致数据的风险。然而,您或负责人必须权衡使用 WITH(NOLOCK)决策的利弊。
你不能在视图中使用“设置事务隔离级别读取未提交”(实际上你只能在视图中使用一个脚本) ,所以如果应该包含脏行,你必须使用(nolock)。