5

我知道with(nolock)并且(nolock)相同或几乎相同。 REF:with(nolock) 或 (nolock) - 有区别吗?

但是怎么样nolock?您可以使用其中任何一个,select我可以看到的唯一显着区别是使用您可以编写的别名时:

select * from table1 as mytable with(nolock)

或者

select * from table1 as mytable (nolock)

但你不能写:

select * from table1 as mytable nolock

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

4

2 回答 2

11

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

  1. WITH推荐使用。来自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 中是无效的语法。

    消息 1018,级别 15,状态 1,第 12 行
    “nolock”附近的语法不正确。如果打算将其作为表提示的一部分,则现在需要 WITH 关键字和括号。有关正确的语法,请参阅 SQL Server 联机丛书。

您还应该考虑使用会话级提示,SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED因为这样您就没有上述语法问题,而且您的查询也没有 15WITH (NOLOCK)秒乱扔垃圾。这些使得以后用不同的隔离级别替换变得更加困难(比如 RCSI,它比READ UNCOMMITTEDIMHO 实用得多),而单个批处理级别的语句是一个非常容易替换的单行语句。

此外,这对于其他读者来说比对 OP 更重要,请绝对确保您了解使用的风险,其中包括在从未存在NOLOCK的单行中获取损坏的数据:

于 2014-01-14T17:33:22.543 回答
1

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

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

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

于 2014-01-14T17:34:57.393 回答