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 表而不获得结果集?
您可以使用永远不匹配的 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)
可能还有其他方法,但这种技术似乎很简单:
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)
| 归档时间: |
|
| 查看次数: |
5969 次 |
| 最近记录: |