2017-06-01 9 views
0

C#コードから複数のストアドプロシージャを実行するコードがあるとします。ストアドプロシージャのそれぞれは、例外の場合にコミットとロールバックを持ちます。例外はこれらのストアドプロシージャ内で処理され、処理されたエラーメッセージが返されます。OracleTransaction.Rollback()はストアド・プロシージャでコミットに代わるものですか?

OracleTransaction.BeginTransaction()が実行中の場合、ストアド・プロシージャの実行時に同じ接続オブジェクトでOracleTransaction.Rollback()が実際に以前に実行されたストアド・プロシージャによってコミットされたデータをロールバックします。

ロジックを次のように

  1. オープン接続
  2. は、すべての良い場合には、(コミットして)別のストアドプロシージャを実行する(内部コミットして)
  3. 取引
  4. 1つのストアドプロシージャを実行開始します。そうでない場合は、前のストアドプロシージャをロールバックして、完全に停止します。
  5. トランザクションをコミットするエラーはありません。 ありがとうございます。
+3

「トランザクション」という用語は、非標準的な方法で使用されているようです(データベースを扱う際の技術的な意味とは一致しません)。あなたは「トランザクション」内で「ストアドプロシージャを実行しない」。むしろ、その逆です。トランザクションをコミットできるのはコミットだけです。コミット後はロールバックできません。問題は、第2の手順の中に第1の手順で行ったことを元に戻す必要があるかもしれない場合、最初に最初の手順の最後にコミットするのはなぜですか? – mathguy

+1

誰でも 'OracleTransaction.BeginTransaction'が何をしているのか知っていますか?クイック検索から私が見つけることができるのは、データベースでトランザクションを開始したことです。ただし、Oracleでは特別なコマンドはありません。私はそれが何もせず、純粋に他のRDBMS製品との互換性のために提供されていると思う。 –

+0

@mathguy残念ながら、これは私が処理しなければならないデータ構造ですが、部分的には対処できない設計上の問題です。第2の手順は、最初の手順は最初の手順の内側にあって、その中でコミットされます。そのクエリーはそれ自身のSPに取り出されなければならなかったが、データは十分に相互依存しているため、2番目に失敗した場合は最初にロールバックする必要があります。私はネストされたトランザクションを実現したいと考えていました。しかし、私はこのhttps://stackoverflow.com/questions/24506847/using-nested-transactions-in-oracleを見つけました。これは基本的に質問を閉じます。 – KonB

答えて

2

COMMITは、現在のトランザクションを終了し、新しいトランザクションは次の実行可能SQL文で開始します。その結果、ROLLBACKは、の変更が元のCOMMITの場合はになりますが、の場合はの前には元に戻すことができません。

関連する問題