与(nolock),(nolock),nolock差异?

时间:2014-01-14 17:23:51

标签: sql sql-server sql-server-2008 nolock

我知道with(nolock)(nolock)相同或几乎相同。 REF:with(nolock) or (nolock) - Is there a difference?

nolock怎么样?您可以在select中使用其中任何一个,我可以看到的唯一值得注意的差异是使用您可以编写的别名:

select * from table1 as mytable with(nolock)

select * from table1 as mytable (nolock)

但你不能写:

select * from table1 as mytable nolock

PS :我不是在讨论nolock这里的好坏:)

2 个答案:

答案 0 :(得分:11)

不同之处在于应该使用语法WITH (NOLOCK)(或WITH (<any table hint>))。为什么呢?

  1. 不推荐使用WITH。来自Table Hints on MSDN

      

    省略WITH关键字是一项不推荐使用的功能:此功能将在Microsoft SQL Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

  2. from table1 nolock根本不应用提示 - 这是别名。例如:

    SELECT nolock.name FROM sys.objects nolock ORDER BY nolock.name;
    

    请注意,我可以使用nolock作为别名。这里没有提示。

  3. from table1 as mytable nolock在SQL Server的现代版本中是无效的语法。

      

    Msg 1018,Level 15,State 1,Line 12
      'nolock'附近的语法不正确。如果这是作为表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参阅SQL Server联机丛书。

  4. 您还应该考虑使用会话级提示SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,因为之后您没有上面的语法问题,并且您也没有15 WITH (NOLOCK)乱丢您的查询。这使得以后更难以用不同的隔离级别替换(比如RCSI,它比READ UNCOMMITTED恕我直言更实用),而单个批次级别的语句是一个非常容易替换的单行。

    此外,对于其他读者而言,这比OP更为明确,请务必了解使用NOLOCK的风险,其中包括在单行中获取从未存在的中的损坏数据< / EM>:

答案 1 :(得分:1)

select查询的表提示部分具有以下语法:

WITH  ( <table_hint> [ [, ]...n ] )

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