SQL Server 2005で問題が発生しました。ストアドプロシージャはPowerBuilderアプリケーションで実行され、別のストアドプロシージャを実行するC#DLLライブラリが呼び出されます。SQL Serverがデッドロックを起こし、被害者を選択しません
最初のプロシージャは、条件に基づいてテーブルに対していくつかの削除を実行し、2番目のプロシージャは、そのテーブルをプライマリデータソースとして使用して別のテーブルに挿入します。プロシージャは、選択するために同じ結合テーブルの一部を使用しますが、1つのテーブルのみが変更されています。
このセットアップではデッドロックが発生することがありますが、SQL Serverはこれについて何もしません。デッドロックのために呼び出されるプロシージャが殺された場合にエラーをログに記録するtry/catchステートメントがDLLライブラリにありますが、ライブラリはプロシージャが完了するのを待っているだけです。私は10分間座ってしまいましたが、まだデッドロックしています。
2番目の手順でDEADLOCK_PRIORITY LOWステートメントを使用しようとしました。選択する前に削除が完了するのを待つ必要があるためです。私はまた、select文をテストするためにただ1つのテーブルにパースしてみましたが、それでもデッドロックに当たっています。私は両方の手順でデッドロックを捕まえるためにBEGIN TRANSACTIONでTRY/CATCHブロックを使用しようとしましたが、どちらも役に立ちませんでした。
ブロックされているSQL Serverにトランザクションを強制終了する方法はありますか?私はDLLのエラーを処理できますが、SQL Serverがエラーを返してそこに座っていれば、何もできません。ありがとう!
明らかにデッドロックが発生した場合、被害者を選ぶ必要があります。ただし、リソースの待機(大規模な変更後にインデックスがオンラインに戻るのを待つ)を処理している場合は、選択したまま待機します。私はいくつかは汚い言葉としてそれを参照してください知っているNOLOCKここで可能な友人ですか?はい、私はあなたがそれを読む時に古くなっているかもしれないデータを読み込むことになるかもしれないことを知っています(コミットされていない挿入は削除と更新などを行います)?それがデッドロックであると確信している場合は、どのタイプのウェイトを取得しているか教えてください。 – HeavenCore
HeavenCoreは重要な違いを指摘しています。デッドロックは決して*終了しませんが、リソース待機は*終了します*終了しますか? – mickeyf
「選択する同じ結合テーブルの一部」では、デッドロックが発生する可能性があります。それらが静的であるか、2つのストアド・プロシージャの持続時間の間静的として扱われる場合、(nolock)を使用してそれらのテーブルに結合します。更新テーブルに対しては、行ロックを取る。 – Paparazzi