2017-06-01 1 views
0

Supposons que j'ai du code avec plusieurs procédures stockées s'exécutant à partir du code C#. Chacune des procédures stockées a un commit et un rollback dans un cas d'exception. Les exceptions sont gérées dans ces procédures stockées et retournent un message d'erreur géré. Si j'ai un OracleTransaction.BeginTransaction() "en cours d'exécution", sur le même objet de connexion lors de l'exécution de procédures stockées, un script OracleTransaction.Rollback() dans C# recule réellement sur une donnée transmise par une procédure stockée précédemment exécutée.OracleTransaction.Rollback() remplace-t-il la validation dans une procédure stockée?

Logic comme suit:

  1. connexion ouverte
  2. Début de la transaction
  3. Exécuter une procédure stockée (avec commit l'intérieur)
  4. Si tout bon, exécutez une autre procédure stockée (avec validation). Si ce n'est pas le cas, annulez la procédure stockée précédente et arrêtez complètement.
  5. Aucune erreur commit transaction. Merci.
+3

Vous semblez être utiliser le terme « transaction » de manière non standard (non conforme au sens technique dans le cadre du travail avec une base de données). Vous ne "exécutez pas une procédure stockée" dans une "transaction"; plutôt, l'inverse. Vous ne pouvez valider qu'une transaction - et une fois qu'elle est validée, elle ne peut pas être annulée. La question est, si quelque chose dans la deuxième procédure peut vous obliger à défaire ce qui a été fait dans la première procédure, pourquoi avez-vous COMMIT à la fin de la première procédure pour commencer? – mathguy

+1

Est-ce que quelqu'un sait ce que fait OracleTransaction.BeginTransaction? D'après une recherche rapide, tout ce que j'ai pu trouver, c'est qu'il '' lance une transaction dans la base de données ''. Cependant, dans Oracle, il n'y a pas de commande spéciale pour le faire. Je suppose qu'il ne fait rien et est fourni uniquement pour la compatibilité avec d'autres produits SGBDR. –

+0

@mathguy Malheureusement, c'est la structure de données à laquelle je dois faire face, c'est en partie un problème de conception qui ne peut être résolu. La deuxième procédure était à l'intérieur du premier et serait engagée en son sein. Cette requête a dû être extraite dans son propre SP, mais les données sont assez interdépendantes, et si la seconde échoue, elle doit d'abord être annulée. J'espérais réaliser des transactions imbriquées, car c'est la seule chose qui me vient à l'esprit. Cependant, j'ai trouvé ce https://stackoverflow.com/questions/24506847/using-nested-transactions-in-oracle, qui ferme fondamentalement la question. – KonB

Répondre

2

Un COMMIT termine la transaction en cours et une nouvelle transaction commence par l'instruction SQL exécutable suivante. En conséquence, un ROLLBACK ultérieur peut seulement annuler les modifications apportées depuis le précédent COMMIT, mais pas avant cela.