2010-10-27 2 views
4

J'ai écrit une transaction comme:Comment faire pour restaurer si une mise à jour n'est pas réussie?

BEGIN TRAN 

    UPDATE [Table1] 
    SET [Name] = 'abcd' 
    WHERE [ID] = 1 

    UPDATE [Table2] 
    SET [Product] = 'efgh' 
    WHERE [ID] = 10 

    UPDATE [Table3] 
    SET [Customar] = 'ijkl' 
    WHERE [ID] = 11 

Maintenant, je veux rollback si une mise à jour est pas le succès. Par exemple, dans le tableau 2, s'il n'y a pas de produit avec ID = 10, la transaction doit être annulée. Comment faire? S'il vous plaît noter que je suis en utilisant SQLServer 2000.

+1

Vous souhaitez le restaurer sur @@ ROWCOUNT? – gbn

Répondre

5

SQL Server 2000. Vous n'avez pas besoin rollback si vous utilisez SET XACT_ABORT ON

SET XACT_ABORT ON --to ensure rollback 
BEGIN TRAN -- @@TRANCOUNT + 1 

UPDATE [Table1] 
SET [Name] = 'abcd' 
WHERE [ID] = 1 
IF @@ROWCOUNT = 0 ROLLBACK TRAN 

IF @@TRANCOUNT > 0 
BEGIN 
    UPDATE [Table2] 
    SET [Product] = 'efgh' 
    WHERE [ID] = 10 

    IF @@ROWCOUNT = 0 ROLLBACK TRAN 
END 

IF @@TRANCOUNT > 0 
BEGIN 
    UPDATE [Table3] 
    SET [Customar] = 'ijkl' 
    WHERE [ID] = 11 

    IF @@ROWCOUNT = 0 ROLLBACK TRAN 
END 

IF @@TRANCOUNT > 0 COMMIT TRAN 
+0

Mais SqlServer 2000 ne supporte pas try catch. – ANP

+0

@gbn - Est-ce que cela est supporté seulement sur SQL 2000 ou sur une version supérieure? –

+0

Cela ne fonctionne toujours pas pour moi. – ANP

1

Avant chaque instruction UPDATE vous devez faire BEGIN TRAN et après chaque instruction UPDATE, vous devez le faire -

if @@Error > 0 
THEN 
BEGIN 
    ROLLBACK TRAN 
END 
Else 
BEGIN 
    COMMIT TRAN 
END 
+0

+1 Pour compenser le downvote inexpliqué – Andomar

+0

@Andomar: pas mon downvote mais nécessite des tests d'erreur * par instruction * @@ Et pour tester @@ rowcount * par déclaration * pour une réponse correcte à ce qui a été demandé. Cette construction par elle-même est inutile. – gbn

+0

@Andomar - Pas de problème, mais je voudrais savoir s'il y a un problème lors de l'utilisation de cette erreur @@ selon vous. Je ne sais vraiment pas l'inconvénient de cela. –

Questions connexes