私が維持しているasp.net 2.0アプリケーションでは、トランザクションの中止エラー(タイムアウト)に関する問題が発生していました。失敗したコードでタイムアウトが発生したように見える場合、transactionscope(デフォルトコンストラクタ)を使用するページロギング機能は失敗しますが、常にそうであるとは限りません。タイムアウトは2分に設定されています。トランザクションタイムアウトと接続プールの問題
我々は我々のアプリに持っているものに似ているいくつかのコード例は以下の通りです:
Try
Dim scope As TransactionScope = New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout)))
**A method call that fails is here**
Using scope
**other code is here**
scope.complete
end using
catch
私が見て何を読んでから、私の推測では、使用してブロックするので、トランザクションに達したことはありませんということですタイムアウトする。次に、ログ・コード(ページ要求で完了)は、既存のトランザクションに参加しようとします。既存のトランザクションは、タイムアウトして、トランザクションのエラーを引き起こします(コンストラクタが呼び出されるとすぐにエラーが発生します)。この仮定は正しいですか?なぜすべてがトランザクションスコープを使用していると仮定して、一部の要求だけが失敗するのでしょうか?
私の大きな疑問は、接続プーリングがこれにどのように影響するのでしょうか?ユーザーAが悪いコードにヒットした場合、ユーザーBはこの影響を受ける可能性がありますか?これは私たちが見た行動です。そうでない場合、これを引き起こす原因は他にありますか?私はMSDNに行ってきましたが、何が起きているのか、なぜそれが本当に何かを見つけることができません。 FYI
Enlist=true;Pooling=true;Connection Lifetime=20;Max Pool Size=25;Min Pool Size=5
:
は、ここで接続文字列の関連部分です。関連性があるかどうかは不明ですが、アプリケーションでEntLibデータベースのファクトリパターンでOracle 11gデータベースを使用しています。
ありがとうございます。
コード変更提案ありがとうございます。我々は絶対にいくつかの変更を加えるつもりです。全体的な問題を理解しているかどうかを確認できますか?TransactionScopeがインスタンス化され、エラーが発生し、scope.complete行が実行されないようになり、接続がタイムアウトします。このトランザクションに参加する後続のtransactionScopeオブジェクトがタイムアウトの理由で直ちに中断するようにします。これが正しい場合、接続はどうなりますか?それはプールに残っていますか?これは、別のユーザーが問題のコードに当たることなく同じエラーを発生させる原因になりますか? –
ご了承ください。私は、接続が決して閉じられない/完了しないので、結局接続プールに戻されることはないと信じています。プールに利用可能な接続がない場合、ユーザーはタイムアウトを開始します。 –
ありがとうございます。このシナリオで何が起こるかを正確に説明するものは見つかりませんでした。 –