Sql-Server

故意鎖定表而不返回結果

  • November 18, 2016

在更新腳本中,我鎖定了幾個表。

BEGIN TRANSACTION
   SELECT Top 0 Null FROM TableA with (holdlock, tablockx)
   SELECT Top 0 Null FROM TableB with (holdlock, tablockx)
   ...

我想抑制它的結果,以便專注於真實的腳本結果。有沒有一種優雅的方法可以在不獲取結果集的情況下對錶進行 xlock?

ssms 中的空結果

可能還有其他方法,但這種技術似乎很簡單:

SET NOCOUNT ON
BEGIN TRANSACTION
declare @DummyVariable INT
SET @DummyVariable = (SELECT  Top 0 Null FROM Test1 with (holdlock, tablockx))

您可以使用從不匹配的 where 子句更新一些記錄,如下所示:

測試設置:

CREATE TABLE locktest (id int, sometext nvarchar(50));

INSERT INTO locktest (id, sometext) VALUES
(1, 'dqsmfkqdsfjm'),
(2, 'qmsdfmdj'), 
(3, 'qkfjmsdfjk');

如果您隨後在一個查詢視窗中執行以下操作:

BEGIN TRAN;
UPDATE locktest WITH (tablockx)  SET id=null WHERE 1=2;

您將看到SELECT在另一個查詢視窗中的 a 被阻止,直到您執行

COMMIT TRAN;

這將鎖定表而不返回結果集。如果你想抑制0 rows affected你可以添加的消息

SET NOCOUNT ON;

如果您只想阻止更新但讓讀者仍然閱讀您可以使用的表格:

UPDATE locktest WITH (tablock, updlock)  SET id=null WHERE 1=2;

引用自:https://dba.stackexchange.com/questions/155580