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();
}
}
トランザクションクラスのDisposeメソッドはロールバックを実行しますが、Oracleのクラスは実行しません。したがって、トランザクションの観点からは、実装に依存します。
一方、接続オブジェクトのusing
ステートメントは、データベースへの接続を閉じるか、リセット後にプールに接続を返します。どちらの場合でも、未処理のトランザクションはロールバックする必要があります。そのため、例外によってアクティブなトランザクションが放置されることはありません。
また、はい、Commit()
を明示的に呼び出す必要があります。
コミットを呼び出す必要があります。 usingステートメントは何もコミットしません。
Commit()
が呼び出されないような例外がある場合、トランザクションは自動的にロールバックされると思います。