【问题标题】:Is NOLOCK the default for SELECT statements in SQL Server 2005?NOLOCK 是 SQL Server 2005 中 SELECT 语句的默认值吗?
【发布时间】:2011-04-22 05:51:40
【问题描述】:

我只安装了 SQL Server 2008R2,但我需要与拥有 2005 的客户沟通。

[1] 告诉:

  • "无锁

    这不会锁定任何对象。这是 SELECT 操作的默认值。它不适用于 INSERT、UPDATE 和 DELETE 语句"

[2] 似乎没有提到它,但我在 SSMS/SS 2008R2 中的检查表明 nolock 不是 SELECT 的默认提示。

WITH(NOLOCK) 真的是 SQL Server 2005 SELECT 中的默认设置吗?
BOL2005/2008 写在哪里?


更新:
在“它写在哪里”下,我希望看到所有从 [1] 部分引用的答案/cmets/澄清(或者,更好的是引用):

  • “这不会锁定任何对象”

    没有 NOLOCK 的 SELECT 是否在 SQL Server 2005 中放置了任何锁(具有默认隔离级别 READ UNCOMMITTED)?
    ...在 SQL Server 2008 中(分别已提交读)?

    我在上面读到的内容可以理解为 NOLOCK 允许忽略/绕过另一个事务放置的现有锁......但目前的事务(带有 NOLOCK 的 SELECT)是否放置(或试图放置)它自己的还不清楚锁...

    READ UNCOMMITTED 隔离级别(用作使用 NOLOCK 提示的同义词)是否意味着没有任何锁定?

  • “它不适用于 INSERT、UPDATE 和 DELETE 语句”
    好像是对的?
    是因为它们(INSERT、UPDATE 和 DELETE)总是锁定而 SELECT 没有锁定吗?
    等等。

[1]
http://blog.sqlauthority.com/2007/04/27/sql-server-2005-locking-hints-and-examples/
[2]
SQL Server 2005 联机丛书。表提示 (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms187373(SQL.90).aspx

【问题讨论】:

标签: sql-server sql-server-2005 tsql sql-server-2008 transactions


【解决方案1】:

duplicate

NOLOCK 不是默认值,不能这样设置。 SQL 授权链接显然是错误的。

【讨论】:

  • 好吧,他从 SQL 权威页面引用的部分确实说 NOLOCK 是选择语句的默认值,但我会说这是错误的。
  • @Damien_The_Unbeliever:嘘。反正我从来不喜欢那个网站
  • 同意 - 该网站有错误。
【解决方案2】:

据我所知,NOLOCK 不是 SELECT 语句的默认设置。如果您想将 NOLOCK 与 SELECT 一起使用,则需要具体指定。

【讨论】:

    【解决方案3】:

    不,据我所知,ROWLOCK 是 NORMAL cicumstances 中 SELECT 语句的默认值。使用 SQL 探查器之类的东西来确认它。显然,其他各种情况都会改变默认锁定策略,例如您是否处于恢复模式和隔离级别等。

    【讨论】:

    • -1 "rowlock" 是粒度,由引擎决定。它不是像 nolock 这样的隔离级别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2011-05-05
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多