SQL Server - 如何锁定表直到存储过程完成

Gre*_*reg 44 sql t-sql sql-server stored-procedures locking

我想做这个:

create procedure A as
  lock table a
  -- do some stuff unrelated to a to prepare to update a
  -- update a
  unlock table a
  return table b
Run Code Online (Sandbox Code Playgroud)

有可能吗?

最后,我希望我的SQL服务器报告服务报告调用过程A,然后只在过程完成后显示表a.(我无法更改程序A以返回表格a).

Gra*_*ham 51

我自己和David Moye提供链接需要这个答案,对此做出了决定并认为它可能对其他人有同样的问题:

CREATE PROCEDURE ...
AS
BEGIN
  BEGIN TRANSACTION

  -- lock table "a" till end of transaction
  SELECT ...
  FROM a
  WITH (TABLOCK, HOLDLOCK)
  WHERE ...

  -- do some other stuff (including inserting/updating table "a")



  -- release lock
  COMMIT TRANSACTION
END
Run Code Online (Sandbox Code Playgroud)

  • TABLOCK将阻止其他会话的更新,TABLOCKX会阻止更新和读取. (11认同)
  • 我们不能为此使用 sp_getapplock (2认同)
  • 从文档(https://msdn.microsoft.com/zh-cn/library/ms189823.aspx),似乎sp_getapplock也可以通过使用sp_releaseapplock来释放锁来完成这项工作。从外观上看,它也具有不必位于事务内部的优点。 (2认同)
  • 另外,如果需要,可以将lock-select插入表变量中,以便将其从输出中隐藏:`DECLARE @HideSelectFromOutput TABLE(DoNotOutput INT); INSERT INTO @HideSelectFromOutput SELECT TOP 1 Id from a WITH(TABLOCK,HOLDLOCK);` (2认同)

Dav*_*oye 15

使用TABLOCKX锁定提示进行交易.有关锁定的更多信息,请参阅此文章.


Xin*_*Xin 15

BEGIN TRANSACTION

select top 1 *
from table1
with (tablock, holdlock)

-- You do lots of things here

COMMIT
Run Code Online (Sandbox Code Playgroud)

这将保持"表锁"直到您当前的"交易"结束.