2012-04-10 19 views
1

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がエラーを返してそこに座っていれば、何もできません。ありがとう!

+0

明らかにデッドロックが発生した場合、被害者を選ぶ必要があります。ただし、リソースの待機(大規模な変更後にインデックスがオンラインに戻るのを待つ)を処理している場合は、選択したまま待機します。私はいくつかは汚い言葉としてそれを参照してください知っているNOLOCKここで可能な友人ですか?はい、私はあなたがそれを読む時に古くなっているかもしれないデータを読み込むことになるかもしれないことを知っています(コミットされていない挿入は削除と更新などを行います)?それがデッドロックであると確信している場合は、どのタイプのウェイトを取得しているか教えてください。 – HeavenCore

+0

HeavenCoreは重要な違いを指摘しています。デッドロックは決して*終了しませんが、リソース待機は*終了します*終了しますか? – mickeyf

+0

「選択する同じ結合テーブルの一部」では、デッドロックが発生する可能性があります。それらが静的であるか、2つのストアド・プロシージャの持続時間の間静的として扱われる場合、(nolock)を使用してそれらのテーブルに結合します。更新テーブルに対しては、行ロックを取る。 – Paparazzi

答えて

2

私はこの記事を見てみましょう:http://www.sql-server-performance.com/2006/reducing-locks/

ここはあなたの問題の一部とすることができるSQL Serverのロックを減らすことについて語っています。私はテーブル/ページ(PageLocks on/off)のロック設定で遊んで、その状況に役立つかどうかを確認することをお勧めします。

問題にパッチを適用する代わりに、根本的な原因を解決してください。

+0

ありがとう、私はリンクを通過した後に問題を解決することができました。 SET LOCK_TIMEOUTを使用して、2番目のプロシージャが停止していないことを確認しました。それが私を悩ましていた主なものです。 2番目の手順からテーブルから削除を削除することで、根本的な問題を解決することができました。今はうまく動いているようだ。 – Greg

関連する問題