2012-01-10 18 views
0

私が維持している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データベースを使用しています。

ありがとうございます。

答えて

1

まず、あなたができるならば、私はあることをあなたのコードを変更します

Using scope As New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout))) 

これが不可能な場合は、あなたがのtry/finally文で、あなたのコードをラップし、最終的に範囲を配置すべきですそれが設定されている場合。

Dim scope As TransactionScope 
    Try 
     scope = New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout))) 

     ' **A method call that fails is here** 

     ' **other code is here** 
     scope.complete() 
    Finally 
     If scope IsNot Nothing Then 
      Try 
       scope.Dispose() 
      Catch 
      End Try 
     End If 
    End Try 

ただし、接続プーリングはタイムアウトの問題に関与している可能性があります。

一般的に言えば、接続文字列は、同じ接続文字列(あれば)が割り当てられているプールから空き接続になるように、接続文字列にキーを付けてプールされます。

接続がプールに返されると、プールにはConnection Lifetimeパラメータで指定された秒数の間プールされたままになり、再利用されないと解放されます。

これに基づいて、接続文字列または接続ごとに異なるその他のデータにユーザー固有の情報があると仮定すると、20人を超えるユーザーが20秒の時間間隔で操作を実行すると、利用可能な接続が不足しています。

さらに、アプリケーションで接続が完全に必要以上に長く開いている場合や、接続が明示的に閉じられていない場合は、接続が予想以上に長く開いたままになる可能性があります。これは、TransactionScopeが処分されていない場合に発生する可能性があります。

+0

コード変更提案ありがとうございます。我々は絶対にいくつかの変更を加えるつもりです。全体的な問題を理解しているかどうかを確認できますか?TransactionScopeがインスタンス化され、エラーが発生し、scope.complete行が実行されないようになり、接続がタイムアウトします。このトランザクションに参加する後続のtransactionScopeオブジェクトがタイムアウトの理由で直ちに中断するようにします。これが正しい場合、接続はどうなりますか?それはプールに残っていますか?これは、別のユーザーが問題のコードに当たることなく同じエラーを発生させる原因になりますか? –

+0

ご了承ください。私は、接続が決して閉じられない/完了しないので、結局接続プールに戻されることはないと信じています。プールに利用可能な接続がない場合、ユーザーはタイムアウトを開始します。 –

+0

ありがとうございます。このシナリオで何が起こるかを正確に説明するものは見つかりませんでした。 –