SQL Server - как заблокировать таблицу до завершения хранимой процедуры
Я хочу сделать это:
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).
Ответы
Ответ 1
Мне нужен этот ответ сам и из ссылки, предоставленной Дэвидом Мойе, решил по этому вопросу и подумал, что он может быть полезен другим людям с тем же вопросом:
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
Ответ 2
Используйте подсказку блокировки TABLOCKX для вашей транзакции. См. статью для получения дополнительной информации о блокировке.
Ответ 3
BEGIN TRANSACTION
select top 1 *
from table1
with (tablock, holdlock)
-- You do lots of things here
COMMIT
Это удержит "блокировку таблицы" до конца вашей текущей "транзакции".