Ocasionalmente, recebo "Não foi possível continuar a verificação NOLOCK
devido à movimentação de dados" em alguns trabalhos grandes, que existem WITH (NOLOCK)
nas consultas selecionadas.
Entendo que isso tem algo a ver com a tentativa de selecionar dados quando houve uma divisão de página que fez com que os dados não estivessem mais onde deveriam estar - presumo que é isso que está acontecendo no meu ambiente.
Como eu reproduzi isso?
Estou tentando fazer uma solução alternativa de curto prazo para detectar o erro e tentar novamente quando isso acontecer, mas não posso testá-lo se não conseguir reproduzi-lo. Existe uma maneira razoavelmente confiável de causar isso?
Quando isso acontece, a execução da consulta novamente resulta em sucesso - então eu realmente não tenho nenhuma preocupação sobre os dados ou banco de dados reais estarem permanentemente corrompidos. Algumas das tabelas da consulta (junto com seus índices) são descartadas, recriadas e repovoadas com frequência, então estou assumindo que é algo relacionado a isso.
A remoção NOLOCK
é o meu problema de longo prazo. O motivo NOLOCK
foi colocado lá em primeiro lugar, porque as consultas são tão ruins que estavam travando as transações diárias, assim NOLOCK
como um band-aid para interromper os impasses (que funcionavam). Então, eu preciso de um band-aid em um band-aid até que possamos fazer uma solução permanente.
Se eu pudesse reproduzi-lo com um Hello World, provavelmente planejaria colocar o curativo no trabalho em menos de uma hora. Não é possível fazer uma remoção de pesquisar e substituir NOLOCK
, porque eu começaria a obter os impasses do aplicativo novamente, o que é pior para mim do que um trabalho ocasional com falha.
Usar o isolamento de snapshot confirmado por leitura é uma boa possibilidade - terei que trabalhar com nossa equipe de banco de dados para obter mais detalhes sobre isso. Parte do nosso problema é que não temos um especialista em SQL Server para lidar com esse tipo de coisa e não entendo os níveis de isolamento suficientemente bem para fazer essa alteração agora.
fonte
NOLOCK
esses trabalhos? 601 deve ser a menor das suas preocupações se os resultados dessas consultas forem precisos . Paul White mostra um exemplo particularmente terrível de leitura de dados que não deveria ser possível aqui .DEADLOCK_PRIORITY
paraLOW
nos postos de trabalho, de modo que se houver impasses, os postos de trabalho irá falhar, e não as aplicações. Depois disso, você pode pesquisar os impasses e descobrir por que eles estão acontecendo e resolver o problema. Pode ser uma correção muito simples, como trocar a ordem de duas instruções. Qualquer que seja o problema, essa nãoNOLOCK
é a solução , então pare de tentar forçá-lo a ser apenas porque é mais fácil.Respostas:
Como um possível "band-aid" para os problemas do NOLOCK é parar de usar o NOLOCK e começar a usar o isolamento READ_COMMITTED_SNAPSHOT, quero apontar para a postagem do blog em http://www.brentozar.com por Kendra Little: Implementando Snapshot ou Read Committed Isolamento de instantâneo no SQL Server: um guia .
A Kendra fornece uma quantidade razoável de detalhes sobre benefícios e riscos ao usar o nível de isolamento READ_COMMITTED_SNAPSHOT.
Alguns anos atrás, implementamos o isolamento READ_COMMITTED_SNAPSHOT em um banco de dados que sofria severamente com o bloqueio . Porém, uma vez que alteramos o nível de isolamento, começamos a obter impasses em algumas áreas críticas.
Por quê isso aconteceu? Como o nível de isolamento anterior causou bloqueio intenso, o código "nunca" pode chegar ao ponto de conflito. No entanto, com o isolamento READ_COMMITTED_SNAPSHOT, as consultas podem continuar avançando. No entanto, alguma porcentagem das transações que não aguardavam mais começou a entrar em conflito.
Felizmente, nosso caso foi resolvido rapidamente, determinando os pontos de conflito e ajustando os índices em algumas tabelas para ter uma ordem de coluna mais racional. Isso reduziu bastante nossos problemas de travamento.
fonte