2009-08-12 2 views
1

私は、単一のトランザクションで多数のデータベース更新を実行する興味深い状況に対処しています。これらの更新が何らかの理由で失敗した場合、トランザクションはロールバックされます。IDbTransactionロールバックタイムアウト

IDbTransaction transaction 
try { 
    transaction = connection.BeginTransaction(); 

    // do lots of updates (where at least one fails) 

    transaction.Commit(); 
} catch { 
    transaction.Rollback(); // results in a timeout exception 
} finally { 
    connection.Dispose(); 
} 

私は上記のコードは、一般的にトランザクション内のデータベース更新を実行するための標準テンプレートと考えられていると信じています。

私が直面している問題は、transaction.Rollback()がSQL Serverに発行されている間も、クライアント上でタイムアウトしていることです。

ロールバックコマンドを発行するタイムアウトとそのコマンドを実行して完了するまでのタイムアウトを区別する方法はありますか?事前に

おかげで、 ベン

答えて

0

あなたはすなわち、スローされた異なる例外を見て、特定の漁獲量を指定する必要があります。 sqlコマンドの処理中にエラーが発生した場合は、SqlExceptionをスローして、プロジェクト内で区別するために異なる例外をキャッチする必要があります。

さらにより多くのあなたにもキャッチし、

例外のためのプログラム可能性 - トランザクションをコミットしようとしたときにエラーが発生しました。

InvalidOperationException - トランザクションがすでにコミットまたはロールバックされています。 - または - 接続が壊れています。

アンドリュー

+0

私はtransaction.Rollback()メソッド呼び出しの文書化されていないタイムアウト例外(その他)をキャッチすることができますが、正確にどのように私は、ロールバックが発生したかどうかを知ることができます確かに。 2つのシナリオでタイムアウト例外が発生すると思います。ロールバックコマンドがSQL Serverに発行されなかった場合は最初のもの、ロールバックコマンドが発行された場合は2番目のものですが、あまりにも時間がかかりました... –

+0

私は上記の例のさらなる実装を見てきました。ロールバック・メソッド呼び出し。ここで、ロールバック・プロシージャ自体によってスローされた例外をキャッチします。これはロールバックできない場合はSQL例外、特定のトランザクション関連のエラーに対してはタイムアウトまたは無効な操作と考える例外があります。 –

関連する問題