2010-03-05 5 views
3

J'ai deux procédures stockées PL/SQL gérant chacune sa propre transaction (Begin/Commit et Rollback en cas d'erreur). À partir du code .Net I Appelez ces deux SP comme indiqué ci-dessous.TransactionScope et procédure stockée?

using (TransactionScope ts = new TransactionScope()) 
    { 
      CallSP1(); 
      CallSP2(). 
      ts.SetComplete(); 
    } 

Si mon appel à SP2 échoue, annulera-t-il les modifications effectuées par CallSP1()? Si elle ne recule pas, cela signifie-t-il qu'il est préférable de gérer la transaction à partir de l'application .Net au lieu de l'intérieur de la procédure stockée?

Répondre

10

Si la première procédure stockée SP1 émet un commit, toutes les modifications déjà effectuées seront permanentes. Dans ce cas, si SP2 échoue, les modifications apportées par SP1 ne seront pas annulées.

IMO L'application appelante doit être celle qui gère la logique de transaction, c'est-à-dire ne pas émettre de validation ou de restauration dans vos procédures PL/SQL. Laissez les erreurs se propager à l'application appelante, de cette façon le moteur PL/SQL annulera uniquement le travail effectué par la procédure défaillante et non la transaction entière.

Laisser l'application appelante décider quoi faire en cas d'erreur (nouvelle tentative, demi-travail de validation ou annulation).

+2

+1. Aucune procédure ne devrait s'engager - elle ne devrait être que savepoint/rollback - sauf si c'est l'appelant ultime; le principal {} dans le programme. –

2

Si SP1 effectue une validation, peu importe ce qui se passe dans SP2. Les modifications apportées dans SP1 ne seront pas annulées - elles ont été validées.

1

Si votre première procédure stockée génère toujours une validation ou une annulation, la seconde procédure stockée ne peut rien affecter à cette transaction.

Si vous souhaitez que l'application appelante contrôle la transaction globale, mais que les procédures stockées récupèrent leurs propres modifications en cas d'erreur, une façon de procéder consiste à définir un point de sauvegarde au début de la procédure stockée . Ensuite, le bloc d'exception de la procédure stockée peut revenir au point de sauvegarde plutôt qu'au début de la transaction (les validations, dans ce cas, ne doivent pas être incluses dans les procédures stockées). Bien sûr, dans ce scénario, il serait important que la procédure stockée informe l'application que l'erreur s'est produite et que l'application traite correctement ce cas.