在研究表提示的使用時,我遇到了兩個問題:我應該使用哪些鎖定提示(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)是我應該使用的方式,但我擔心自己可能犯了一個錯誤或忽略了某些東西,這些東西將來會再次咬我,因此出現了這個問題。
對UPDLOCK,HOLDLOCK感到困惑
開心每一天1111
2019-12-10 10:51:45