SQL Server - Как заблокировать таблицу до завершения хранимой процедуры - PullRequest
40 голосов
/ 08 сентября 2010

Я хочу сделать это:

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

Возможно ли что-то подобное?

В конечном итоге я хочу, чтобы мой отчет служб отчетов SQL Server вызывал процедуру A, а затем отображал таблицу a только после ее завершения. (Я не могу изменить процедуру A для возврата таблицы a).

Ответы [ 3 ]

49 голосов
/ 20 мая 2014

Мне понадобился этот ответ, и по ссылке , предоставленной Дэвидом Мойе , решил это и подумал, что он может быть полезен другим с таким же вопросом:

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
15 голосов
/ 08 сентября 2010

Используйте подсказку блокировки TABLOCKX для вашей транзакции. См. Эту статью для получения дополнительной информации о блокировке.

12 голосов
/ 28 февраля 2017
BEGIN TRANSACTION

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

-- You do lots of things here

COMMIT

Это удержит «блокировку таблицы» до конца вашей текущей «транзакции».

...