Nous avons une application client qui exécute du SQL sur un SQL Server 2005, comme suit:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Il est envoyé par une commande de chaîne longue.
Si l'une des insertions échoue ou si une partie de la commande échoue, SQL Server annule-t-il la transaction? S'il n'effectue pas de restauration, dois-je envoyer une deuxième commande pour l'annuler?
Je peux donner des détails sur l'API et la langue que j'utilise, mais je pense que SQL Server devrait répondre de la même manière pour n'importe quelle langue.
sql
sql-server
sql-server-2005
transactions
jonathanpeppers
la source
la source
Réponses:
Vous pouvez mettre
set xact_abort on
avant votre transaction pour vous assurer que sql revient automatiquement en cas d'erreur.la source
xact_abort
est au niveau de la connexion.Vous avez raison de dire que toute la transaction sera annulée. Vous devez émettre la commande pour l'annuler.
Vous pouvez envelopper ceci dans un
TRY CATCH
bloc comme suitla source
try
), mais le code échoue après. Il n'y a plus de transaction, mais vous entrez toujours dans lecatch
.Voici le code pour obtenir le message d'erreur fonctionnant avec MSSQL Server 2016:
la source
DECLARE @Var TYPE; SET @Var = ERROR;
pour augmenter les erreurs dans le serveur SQL 2005. Sinon, le code ci-dessus pour augmenter les erreurs fonctionne aussi pour les anciennes bases de données. Essayer d'attribuer une valeur par défaut à une variable locale est ce qui causait le problème.De l'article MDSN, Controlling Transactions (Database Engine) .
Dans votre cas, il annulera la transaction complète lorsque l'un des insertions échouera.
la source
Non.
Bien sûr, vous devriez émettre
ROLLBACK
au lieu deCOMMIT
.Si vous souhaitez décider de valider ou d'annuler la transaction, vous devez supprimer la
COMMIT
phrase de l'instruction, vérifier les résultats des insertions, puis émettre l'uneCOMMIT
ou l' autre ou enROLLBACK
fonction des résultats de la vérification.la source
Named Pipes
ouTCP
) interrompt la connexion. Lorsqu'une connexion est interrompue,SQL Server
arrête toutes les commandes en cours d'exécution et annule la transaction.