Answers:
WITH(NOLOCK)是表级别的提示。将事务隔离级别设置为READ_UNCOMMITTED会影响连接。区别在于范围。请参阅SQL Server文档中的READUNCOMMITTED和NOLOCK:
http://technet.microsoft.com/zh-CN/library/ms187373.aspx
对于事务隔离级别:http : //technet.microsoft.com/zh-cn/library/ms173763.aspx
据我所知,唯一的区别是效应的范围,如斯特罗米所说。在表上提示NOLOCK,在会话上提示READ UNCOMMITTED。
至于可能发生的问题,全都与一致性有关。如果您在乎的话,请注意您会得到所谓的脏读,这可能会影响对不正确信息进行处理的其他数据。
我个人认为我没有从中看到任何问题,但这可能更多是由于我使用nolock的原因。您需要注意,在某些情况下可以使用它。场景中,您主要是向表中添加新数据,但后面有另一个过程来检查数据场景。这可能是可以的,因为主要流程不包括在读取过程中返回和更新行。
我也相信这些天您应该研究多版本并发控制。我相信他们在2005年添加了它,它通过为读者提供要使用的数据库快照来帮助阻止作者阻止读者。我将提供一个链接,并将进一步的研究留给读者:
由于必须对每个表使用WITH(NOLOCK),因此在每个FROM或JOIN子句中写入它可能会很烦人。但是,将其称为“脏”读取有其原因。因此,您确实应该知道何时进行操作,而不要将其设置为会话范围的默认值。为什么?
忘记一个WITH(NOLOCK)可能无法在一个非常戏剧性的方式影响你的程序,但是做了脏读,你做不在某些情况下希望可能会有所作为。
因此,如果允许选择的当前数据不正确,请使用WITH(NOLOCK),因为稍后可能会回滚。当您想提高性能时,通常使用此方法,而对应用程序上下文的要求使它冒着显示不一致数据的风险。但是,您或负责人必须权衡使用WITH(NOLOCK)的决定的利弊。
REPEATABLE READ
而不是SERIALIZABLE
如果您不在乎幻像数据。SERIALIZABLE
实际上是限制性的,几乎不应该使用(例如在某些关键的财务应用程序中除外)。