web-dev-qa-db-ja.com

エラーが発生した場合、usingステートメントはデータベーストランザクションをロールバックしますか?

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();
    }
}
80
mezoid

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

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

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

100
Sedat Kapanoglu

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

19
jhale

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

4
Tommy Hui