1. ホーム
  2. c#

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

2023-06-06 07:22:11

質問

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() を明示的に呼び出す必要があります。