85

using ステートメントに IDbTransaction がありますが、using ステートメントで例外がスローされた場合にロールバックされるかどうかはわかりません。using ステートメントが Dispose() の呼び出しを強制することは知っていますが、Rollback() についても同じことが当てはまるかどうかは誰にもわかりませんか?

更新:また、以下のように Commit() を明示的に呼び出す必要がありますか、それとも using ステートメントによって処理されますか?

私のコードは次のようになります。

using Microsoft.Practices.EnterpriseLibrary.Data;

...

using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
    connection.Open();

    using(IDbTransaction transaction = connection.BeginTransaction())
    {
       //Attempt to do stuff in the database
       //potentially throw an exception
       transaction.Commit();
    }
}
4

3 に答える 3

106

トランザクション クラスの Dispose メソッドはロールバックを実行しますが、Oracle のクラスは実行しません。したがって、トランザクションの観点からは、実装に依存します。

一方、接続オブジェクトのusingステートメントは、データベースへの接続を閉じるか、接続をリセットした後にプールに戻します。いずれの場合も、未処理のトランザクションはロールバックする必要があります。そのため、例外によってアクティブなトランザクションが放置されることはありません。

また、はい、Commit()明示的に呼び出す必要があります。

于 2009-03-13T06:38:08.773 に答える
18

コミットを呼び出す必要があります。using ステートメントは、何もコミットしません。

于 2009-03-14T00:57:52.453 に答える
5

呼び出されなかったような例外がある場合Commit()、トランザクションは自動的にロールバックされると思います。

于 2009-03-13T06:38:39.817 に答える