Tenho acesso a um banco de dados em modo read uncommitted e preciso fazer manutenção em uma tabela em ambiente operativo. Preciso adquirir um cadeado exclusivo em uma mesa, fazer um trabalho e depois liberar o cadeado.
Durante essa manutenção, mesmo as consultas de leitura não devem obter dados não confirmados de volta.
Esta pergunta e resposta parece promissora. Eu faço:
begin transaction;
SELECT TOP (1) 1 FROM a WITH (TABLOCK);
mas então, um SIX
bloqueio é adquirido na tabela a
. No entanto, isso não bloqueia a tabela de consultas selecionadas. Como posso adquirir Sch-M
o bloqueio na mesa? No máximo consigo o Sch-S
cadeado com:
SELECT TOP (1) * FROM a WITH (TABLOCK);
isso ainda não bloqueia consultas selecionadas na tabela.
Existem várias maneiras de fazer literalmente o que você pede, mas eu geralmente desaconselharia o uso de qualquer uma delas. Na maioria dos casos, tudo o que você precisa fazer é impedir qualquer alteração na tabela enquanto o processo é concluído. Isso pode ser feito com uma
TABLOCKX
dica dentro da transação:Você também pode revogar temporariamente as permissões ou usar um bloqueio de aplicativo . Existem outras alternativas; a melhor abordagem depende dos detalhes.
Se você realmente deseja adquirir o Sch-M (um bloqueio do sistema), uma maneira é chamar,
sp_compile
por exemplo:Se todo o conteúdo da tabela for invalidado por qualquer manutenção que você esteja fazendo, você naturalmente obterá um bloqueio Sch-M ao executar um arquivo
TRUNCATE TABLE
. Novamente, o que é melhor depende de detalhes que não foram fornecidos.