NOLOCK是SQL Server 2005中SELECT语句的默认值吗?

时间:2010-10-07 08:17:52

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

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

[1]告诉:

  • “的 NOLOCK

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

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

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


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

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

    没有NOLOCK的SELECT是否在SQL Server 2005中放置任何锁定(默认隔离级别为READ UNCOMMITTED)?
    ...在SQL Server 2008中(分别是READ COMMITTED)?

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

    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

3 个答案:

答案 0 :(得分:11)

请参阅duplicate

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

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

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