WITH(NOLOCK)vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Jim*_*m B 114 sql sql-server sql-server-2005

可能有人给我时,我应该使用一些指导WITH (NOLOCK),而不是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

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

HLG*_*GEM 101

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

两者都会给你脏读.如果你对此没问题,那就用它们吧.如果你不能有脏读,那么请考虑snapshotserializable提示.


Ano*_*246 25

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

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

对于TRANSACTION ISOLATION LEVEL:http: //technet.microsoft.com/en-us/library/ms173763.aspx


gbn*_*gbn 10

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

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


Sea*_*ver 9

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

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

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

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

MVCC

数据库隔离级别


Rez*_*Net 6

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