Recentemente, executei uma consulta de atualização em 100.000 registros. Percebi que havia cometido um erro enquanto a consulta estava sendo executada e rapidamente desconectei o cabo de rede.
A consulta de atualização
- parar o processamento e reverter completamente?
- continuar processando até a conclusão e confirmar?
- parar o processamento e deixar apenas parte das linhas de destino atualizadas?
sql-server
network
robocop
fonte
fonte
Respostas:
Conforme mencionado por Nick e Martin, o status final da sua consulta depende se o SQL Server conhece o cabo de rede puxado antes da conclusão da consulta. Do Books Online (embora eu ache interessante que haja tópicos equivalentes para isso em 2000 , 2005 , 2008 e 2008 R2 , mas não em 2012 ou 2014):
(À parte, essa palavra conexões na 2ª última frase provavelmente deveria ser transações . Não sei como reverter uma conexão.)
De maneira semelhante, o SQL Server pode desfazer ou refazer transações durante a recuperação depois que o servidor for desligado inesperadamente, e isso dependerá do estado da transação no momento do desligamento. Vi pessoas usarem essa tática para conseguir o que você estava tentando fazer (cancelar a (s) transação (ões)) e, quando o servidor foi reiniciado, grande parte do trabalho foi simplesmente refeita (o efeito líquido de sua reação instintiva ficou muito mais próximo a zero do que eles esperavam).
Portanto, em vez de ficar sujeito a isso, em vez de fazer coisas drásticas em pânico, como puxar um cabo de rede ou desligar a máquina, sugiro que no futuro você tenha uma melhor disciplina sobre a execução de consultas ad hoc em sistemas importantes. Por exemplo, em vez de:
Tenha isto:
Então, se a atualização estava realmente correta, você pode destacar a
COMMIT
peça e executá-la. Caso contrário, você pode destacar com calma aROLLBACK
peça e executá-la. Você pode até usar suplementos como o SSMS Tools Pack para editar seuNew Query
modelo e incluir esse padrão.Agora, ainda assim, você poderá ter problemas no caso de executar a consulta e depois não confirmar ou reverter, porque agora sua transação está bloqueando outros usuários. Mas isso é melhor do que modificar dados irrevogavelmente.
E, é claro, como sempre, tenha um backup em que você possa confiar.
fonte
@Aaron está correto. Criar uma transação antes dos seus comandos é sua melhor aposta. Se você não se lembra de fazer isso, uma opção é entrar na
Tools-Options
configuração e ativarSET IMPLICIT_TRANSACTIONS
. Isso iniciará automaticamente uma transação assim que determinados comandos forem executados. Isto incluiUPDATE
,DELETE
etc. Esta parece ser uma lista bastante completa de qualquer comando que faria"change"
alguma coisa.SELECT
também está incluído na lista ewill
inicia uma transação. Você pode ver uma lista completa dos comandos que iniciam uma transação com esta configuração aqui . Não criará uma transação se uma já estiver iniciada. Agora, o lado ruim disso é que você terá que se lembrar deCOMMIT
depois de qualquer alteração feita.NOTA: Com base na sugestão de @ Aaron, vou enfatizar novamente isso.
Basicamente, você está trocando o esquecimento de
BEGIN
uma transação e atrapalhando algo, por esquecerCOMMIT
uma transação e deixá-la travada se você a deixar aberta e depois deixar o dia. Eu testei apenas fechando uma janela de consulta pensando que isso reverteria minha transação, no entanto, ele me perguntou se eu queria confirmar ou reverter a transação.fonte
SELECT
vai iniciar uma transação (que também está documentada no link que você postou)Eu acho que realmente depende:
se o comando já chegar ao servidor antes de você desconectar o cabo de rede, o comando continuará sendo executado normalmente.
se você tiver um TransactionScope (usado em .Net, não sabe outros idiomas) para encapsular todos os comandos de atualização, provavelmente poderá impedir que a transação seja confirmada apenas se o transactionScope.Complete () não tiver sido executado, mas não há garantia. .
fonte