故意锁定表而不返回结果

VV5*_*722 3 sql-server sql-server-2008-r2 blocking

在更新脚本中,我锁定了几个表。

BEGIN TRANSACTION
    SELECT Top 0 Null FROM TableA with (holdlock, tablockx)
    SELECT Top 0 Null FROM TableB with (holdlock, tablockx)
    ...
Run Code Online (Sandbox Code Playgroud)

我想抑制它的结果,以便专注于真实的脚本结果。有没有一种优雅的方法来 xlock 表而不获得结果集?

ssms 中的结果为空

Tom*_*m V 8

您可以使用永远不匹配的 where 子句更新一些记录,如下所示:

测试设置:

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

INSERT INTO locktest (id, sometext) VALUES
(1, 'dqsmfkqdsfjm'),
(2, 'qmsdfmdj'), 
(3, 'qkfjmsdfjk');
Run Code Online (Sandbox Code Playgroud)

如果然后,在一个查询窗口中执行以下操作:

BEGIN TRAN;
UPDATE locktest WITH (tablockx)  SET id=null WHERE 1=2;
Run Code Online (Sandbox Code Playgroud)

您将看到SELECT另一个查询窗口中的 a 被阻止,直到您执行

COMMIT TRAN;
Run Code Online (Sandbox Code Playgroud)

这将锁定表而不返回结果集。如果你想抑制0 rows affected你可以添加的消息

SET NOCOUNT ON;
Run Code Online (Sandbox Code Playgroud)

如果您只想阻止更新但让读者仍然阅读表格,您可以使用:

UPDATE locktest WITH (tablock, updlock)  SET id=null WHERE 1=2;
Run Code Online (Sandbox Code Playgroud)


Sco*_*red 8

可能还有其他方法,但这种技术似乎很简单:

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