HOLDLOCK对UPDLOCK有什么影响?

我已经看到许多HOLDLOCK提示与UPDLOCK结合使用的例子(像这样)。 然而,微软的这些提示文档使得看起来像HOLDLOCK应该是多余的,因为UPDLOCK已经持续锁定直到事务结束。 (也似乎说HOLDLOCK只适用于共享锁。)

HOLDLOCK如何影响查询?


它有很大的影响力。

Update锁在行上执行Update锁,在页上执行Intent更新并在表/数据库上执行共享锁。

这不会阻止其他查询访问表中的数据,因为页/数据库上的锁完全是共享锁。 它们可能不会通过尝试执行与锁相冲突的操作而对单个行/页/表冲突锁。 如果发生这种情况,请求将排队在当前锁之后并等待它在可以继续之前可用。

通过使用holdlock,查询被强制序列化,锁定表格直到操作完成。 这样可以防止任何人读取表,除非使用nolock提示,从而允许潜在的脏读。

要查看效果,请生成示例表'foo'并在其中放入一些垃圾数据。

begin tran

select * from foo with (updlock)
where tableid = 1
-- notice there is no commit tran

打开另一个窗口并尝试:

select * from foo

行返回,现在提交原始查询事务。 重新运行它以更改为使用holdlock:

begin tran

select * from foo with (updlock, holdlock)
where tableid = 1

回到另一个窗口并尝试再次选择数据,查询将不会返回值,因为它被排它锁锁定。 在第一个窗口提交事务,并且第二个查询的结果将显示,因为它不再被阻止。

最终测试是使用nolock,使用updlock和holdlock再次运行事务。 然后在第二个窗口中运行以下内容:

select * from foo (nolock)

结果会自动回来,因为您已经接受了脏读的风险(读取未提交)。

所以它看起来有很大的影响,因为你迫使对该表的操作被序列化,这可能是你想要的(取决于正在进行的更新)还是会在该表上创建一个非常大的瓶颈。 如果每个人都在长时间运行的事务中忙碌到桌面,那么它会在应用程序中造成严重的延迟。

与所有SQL功能一样,如果使用正确,它们可以很强大,但功能/提示的错误使用可能会导致严重问题。 我更喜欢使用提示作为当我必须重写引擎时的最后手段 - 而不是默认方法。

按请求编辑:在SQL 2005,2008,2008 R2(All Enterprise)中测试 - 全部安装在非常多默认设置下,使用所有默认设置创建的测试数据库(仅输入数据库的名称)。


安德鲁的答案根据MSDN文档是正确的,但是我对2008R2和2012进行了测试,我没有看到这种行为,所以请自己测试一下

我看到的行为如下:

首先在播放数据库上运行此操作。

CREATE TABLE [dbo].[foo](
    [tableid] [int] IDENTITY(1,1) NOT NULL,
    [Col2] [varchar](100) NOT NULL,
    CONSTRAINT [PK_foo] PRIMARY KEY CLUSTERED 
    (
        [tableid] ASC
    )
)

...并放入几行。

现在将此代码粘贴到两个查询选项卡中(更改选项卡二中的“选项卡一”文本):

begin tran

select * from foo with (UPDLOCK, HOLDLOCK)
where tableid = 1

UPDATE foo SET Col2 = 'tab one'
where tableid = 1

commit tran

并把它放在另一个标签中3

select * from foo
where tableid = 1
  • 确保您指向表格所在的播放数据库。

  • 突出显示选项卡1中的更新语句之前所有内容并执行。

  • 标签2中做同样的事情,你会发现标签2不会完成并仍在执行。

  • 现在在我的环境中执行选项卡3 的简单SELECT, 完成。

  • 突出显示选项卡1中的更新语句并执行它(不要执行提交),您将看到选项卡2仍在执行。

  • 继续执行选项卡1中的提交... 选项卡2现在将完成选择...您可以运行其余的选项。

  • 链接地址: http://www.djcxy.com/p/5609.html

    上一篇: What effect does HOLDLOCK have on UPDLOCK?

    下一篇: How to lock a specific row that doesn't exist yet in SQL Server