为了账号安全,请及时绑定邮箱和手机立即绑定

对UPDLOCK,HOLDLOCK感到困惑

对UPDLOCK,HOLDLOCK感到困惑

开心每一天1111 2019-12-10 10:51:45
在研究表提示的使用时,我遇到了两个问题:我应该使用哪些锁定提示(T-SQL)?HOLDLOCK对UPDLOCK有什么影响?对这两个问题的回答都表明,使用时(UPDLOCK, HOLDLOCK),其他进程将无法读取该表上的数据,但是我没有看到这一点。为了进行测试,我创建了一个表并启动了两个SSMS窗口。在第一个窗口中,我运行了一个使用各种表提示从表中选择的事务。在事务运行时,我从第二个窗口运行了各种语句,以查看哪些将被阻止。测试表:CREATE TABLE [dbo].[Test](    [ID] [int] IDENTITY(1,1) NOT NULL,    [Value] [nvarchar](50) NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED (    [ID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]从SSMS窗口1:BEGIN TRANSACTIONSELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)WAITFOR DELAY '00:00:10'COMMIT TRANSACTION在SSMS窗口2中(运行以下命令之一):SELECT * FROM dbo.TestINSERT dbo.Test(Value) VALUES ('bar')UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'DELETE dbo.Test WHERE Value= 'baz'不同的表提示对在Window 2中运行的语句的影响:           (UPDLOCK)       (HOLDLOCK)    (UPDLOCK, HOLDLOCK)    (TABLOCKX)---------------------------------------------------------------------------SELECT    not blocked      not blocked       not blocked         blockedINSERT    not blocked        blocked           blocked           blockedUPDATE      blocked          blocked           blocked           blockedDELETE      blocked          blocked           blocked           blocked我是否误解了这些问题中给出的答案,或者在测试中犯了错误?如果没有,您为什么要单独使用(UPDLOCK, HOLDLOCK)vs (HOLDLOCK)?关于我要完成的工作的进一步说明:我想从表中选择行,并防止在处理表时修改该表中的数据。我没有修改该数据,并希望允许进行读取。这个答案清楚地表明,这(UPDLOCK, HOLDLOCK)将阻止读取(不是我想要的)。关于此答案的评论暗示这是HOLDLOCK阻止阅读的原因。为了尝试更好地理解表提示的效果,看看是否有UPDLOCK单独的功能可以满足我的要求,我做了上面的实验,得出了与那些答案相反的结果。目前,我相信这(HOLDLOCK)是我应该使用的方式,但我担心自己可能犯了一个错误或忽略了某些东西,这些东西将来会再次咬我,因此出现了这个问题。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 754 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信