SQL Server – Como bloquear uma tabela até que um procedimento armazenado seja concluído

Eu quero fazer isso:

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 

É algo assim possível?

Por fim, quero que o relatório de serviços de relatório do SQL Server chame o procedimento A e só mostre a tabela a após o término do procedimento. (Não consigo alterar o procedimento A para retornar a tabela a).

Precisava dessa resposta eu mesmo e, a partir do link fornecido por David Moye , decidi sobre isso e achei que poderia ser útil para outras pessoas com a mesma pergunta:

 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 

Use a dica de bloqueio TABLOCKX para sua transação. Veja este artigo para mais informações sobre bloqueio.

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

Isso manterá o ‘bloqueio de tabela’ até o final da transaction atual.