Temos um aplicativo cliente que está executando algum SQL em um SQL Server 2005, como o seguinte:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
É enviado por um comando de cadeia longa.
Se uma das inserções falhar, ou qualquer parte do comando falhar, o SQL Server reverterá a transação? Se não reverter, tenho que enviar um segundo comando para revertê-lo?
Posso fornecer informações específicas sobre a API e o idioma que estou usando, mas acho que o SQL Server deve responder o mesmo para qualquer idioma.
sql
sql-server
sql-server-2005
transactions
jonathanpeppers
fonte
fonte
Respostas:
Você pode colocar
set xact_abort on
antes da transação para garantir que o sql seja revertido automaticamente em caso de erro.fonte
xact_abort
está no nível da conexão.Você está certo de que toda a transação será revertida. Você deve emitir o comando para recuperá-lo.
Você pode agrupar isso em um
TRY CATCH
bloco da seguinte maneirafonte
try
), mas o código falha depois. Não há mais transações, mas você ainda está entrando nocatch
.Aqui está o código para obter a mensagem de erro trabalhando com o MSSQL Server 2016:
fonte
DECLARE @Var TYPE; SET @Var = ERROR;
para gerar erros no sql server 2005. Caso contrário, o código acima para gerar erros também funciona para bancos de dados mais antigos. Tentar atribuir um valor padrão a uma variável local é o que estava causando o problema.Do artigo MDSN, Controlando transações (Mecanismo de Banco de Dados) .
No seu caso, ele reverterá a transação completa quando alguma das inserções falhar.
fonte
Não, não tem.
Claro, você deve emitir em
ROLLBACK
vez deCOMMIT
.Se você quiser decidir se deve confirmar ou reverter a transação, remova a
COMMIT
frase da instrução, verifique os resultados das inserções e emita umCOMMIT
ou outroROLLBACK
dependendo dos resultados da verificação.fonte
Named Pipes
ouTCP
) interrompe a conexão. Quando uma conexão é interrompida,SQL Server
para todos os comandos em execução no momento e reverte a transação.