実行がタイムアウトする理由を理解するには、サーバー側でこれを調査する必要があります。サーバーにはタイムアウトがないことに注意してください。タイムアウトは、 SqlCommand.CommandTimeout
。
優れたリソースは、待機とキュー です。 、これはSQLServerのパフォーマンスのボトルネックを診断するための方法論です。タイムアウトの実際の原因に基づいて、適切なアクションを実行できます。実行が遅い(悪い計画)か、ブロックするかを何よりもまず確立する必要があります。
思い切って推測すると、IF EXISTS... UPDATE
の不健康なパターンと言えます。 根本的な原因です。このパターンは正しくなく、同時実行時に障害が発生します。 IF EXISTS
を実行する2つの同時トランザクション 同時に両方が同じ結論に達し、両方 INSERT
を試みます またはUPDATE
。データベース内の既存の制約に応じて、デッドロック(幸運な場合)または書き込みの喪失(不幸な場合)が発生する可能性があります。ただし、適切な調査によってのみ、実際の根本原因が明らかになります。 自動成長イベント
。
あなたの手順はまた、CATCHブロックを誤って処理しています。 常にする必要があります XACT_STATE()
を確認してください
CATCHブロックが実行されるまでに、トランザクションがすでにロールバックされている可能性があるためです。また、トランザクションに名前を付けることから何を期待するかが明確ではありません。これは、名前付きトランザクションをセーブポイントと混同することに関連してよく見られるよくある間違いです。正しいパターンについては、例外処理とネストされたトランザクションを参照してください。 a> 。
編集
これを調査するための可能な方法は次のとおりです。
- 関連する
CommandTimeout
0まで(つまり無限)。 -
blocked process threshold
を有効にします 、30秒に設定します(以前のCommandTimeout) - プロファイラーで
ブロックされたプロセスレポートイベント を監視します - ワークロードを開始します
- プロファイラーがレポートイベントを生成するかどうかを確認します。もしそうなら、彼らは原因を特定します。
これらのアクションにより、タイムアウトがブロックによって引き起こされた場合、タイムアウトが発生するたびに「ブロックされたプロセスレポート」イベントが発生します。 ライブロック その後、永遠に待ちます。