sql >> データベース >  >> RDS >> Sqlserver

時折SqlExceptionを取得する:タイムアウトの期限が切れました

    実行がタイムアウトする理由を理解するには、サーバー側でこれを調査する必要があります。サーバーにはタイムアウトがないことに注意してください。タイムアウトは、 SqlCommand.CommandTimeout

    優れたリソースは、待機とキュー です。 、これはSQLServerのパフォーマンスのボトルネックを診断するための方法論です。タイムアウトの実際の原因に基づいて、適切なアクションを実行できます。実行が遅い(悪い計画)か、ブロックするかを何よりもまず確立する必要があります。

    思い切って推測すると、IF EXISTS... UPDATEの不健康なパターンと言えます。 根本的な原因です。このパターンは正しくなく、同時実行時に障害が発生します。 IF EXISTSを実行する2つの同時トランザクション 同時に両方が同じ結論に達し、両方 INSERTを試みます またはUPDATE 。データベース内の既存の制約に応じて、デッドロック(幸運な場合)または書き込みの喪失(不幸な場合)が発生する可能性があります。ただし、適切な調査によってのみ、実際の根本原因が明らかになります。 自動成長イベント

    あなたの手順はまた、CATCHブロックを誤って処理しています。 常にする必要があります XACT_STATE()を確認してください CATCHブロックが実行されるまでに、トランザクションがすでにロールバックされている可能性があるためです。また、トランザクションに名前を付けることから何を期待するかが明確ではありません。これは、名前付きトランザクションをセーブポイントと混同することに関連してよく見られるよくある間違いです。正しいパターンについては、例外処理とネストされたトランザクション

    編集

    これを調査するための可能な方法は次のとおりです。

    1. 関連するCommandTimeout 0まで(つまり無限)。
    2. blocked process thresholdを有効にします 、30秒に設定します(以前のCommandTimeout)
    3. プロファイラーでブロックされたプロセスレポートイベント を監視します
    4. ワークロードを開始します
    5. プロファイラーがレポートイベントを生成するかどうかを確認します。もしそうなら、彼らは原因を特定します。

    これらのアクションにより、タイムアウトがブロックによって引き起こされた場合、タイムアウトが発生するたびに「ブロックされたプロセスレポート」イベントが発生します。 ライブロック その後、永遠に待ちます。



    1. SQLAlchemyで生のSQLを実行する方法

    2. Postgresの大文字と小文字の区別

    3. sqliteデータベースの名前に従ってドローアブルから画像を取得し、リストビューで表示する方法

    4. PDOとプリペアドステートメントを使用したMySQLアップデートが機能しない