Sql-Server
故意鎖定表而不返回結果
在更新腳本中,我鎖定了幾個表。
BEGIN TRANSACTION SELECT Top 0 Null FROM TableA with (holdlock, tablockx) SELECT Top 0 Null FROM TableB with (holdlock, tablockx) ...
我想抑制它的結果,以便專注於真實的腳本結果。有沒有一種優雅的方法可以在不獲取結果集的情況下對錶進行 xlock?
可能還有其他方法,但這種技術似乎很簡單:
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;