2012-05-03 23 views
2

まず、SQL Server 2005のデッドロックの実際の根本原因を知りたいのですが、2つのプロセスが同じ行をテーブルにアクセスすると、それがありますか?SQL Server 2005でデッドロックを解除する方法は?

とにかく、同じ構造を持つ2つのテーブル_Table_Now__Table_History_を考えてみましょう。

NAMEという1つの列があるとします。

だから、一つのプロセスが_Table_Now_NAME='BLUE'でレコードを更新しようとすると、まず、それが_Table_History_NAME='BLUE'で現在の行を配置する必要があり、その後 _Table_Now_を更新し、また_Table_History_から以前に現在の行を削除します。

削除中にデッドロックが発生します。私はなぜなのか理解していない?

私を案内してください! Bが終了し、BはAのみが何

を完了したときに、\継続開始する時期Aがちょうど続ける\開始しますので

+2

デッドロックには通常、複数の同時トランザクションが含まれます。 1つのトランザクションについて説明しました。デッドロックに含まれる他のトランザクションは何ですか? – NPE

+1

良い方法は、 'with(NOLOCK)'や 'with(ROWLOCK)'などのクエリごとにヒントを与えてデッドロックを回避することです。他の人が続けることを許可するID – AbstractChaos

+0

これ以上の情報がなければ、助けが難しいだろう。ここでデッドロックを分析するためにSQLプロファイラを使用する方法のリンクhttp://msdn.microsoft.com/en-us/library/ms188246.aspx –

答えて

1

プロセスAがプロセスB及びプロセスBに依存していると、デッドロックは基本的意味は、プロセスAに依存していますテーブル(または行)ロックが発生している可能性があります.SQLはテーブルを更新する前に行をロックして、更新を実行している間に他のプロセスがその行にアクセスしようとしていないことを確認します。

insert \ update \ deleteの仕組みについて具体的に説明できますか。このシナリオではデッドロックはありません。

参考として、with (NOLOCK)を使用しないでください。はい、ロックを防止しますが、コミットされていないデータを読み取るようにSQL Serverに指示することで、データの不一致が生じる可能性があります。

+0

それは心配の私の理由です。通常の状況では、デッドロックがあってはなりません。新しいクエリウィンドウを開いて、SELECT * FROM _Table_History_のような単純なselectクエリを書くときでも、NAME = 'BLUE' ...このステートメントを実行すると、デッドロックが表示されます。 – JackAss

+1

デッドロックの発生状況の詳細を教えてください – Diego

+0

Ok.IはSQL Server 2005を使用しています。SQL Server 2005ではいくつかの接続が実行可能で、いくつかはスリープ状態ですが、いくつかは中断されています。 SUSPENDED接続の数が増えると、アプリケーションがダウンします。私はsp_who2を実行しました – JackAss

0

プロセスAがプロセスBがリソースを解放するのを待っていて、プロセスBがプロセスAがリソースを解放するのを待っているときに、デッドロックが発生します。 Table_Now
でTable_History

1 Table_Now
の行を読む 2.更新行 3.更新した行 4.削除:

私が正しくアップデートの順序を理解していれば、それはこれですTable_Historyの行。

トランザクションやロックを誤って使用すると、危険な順序になる可能性があります。デッドロックを回避するために

、各プロセスのためにあなたが実行してください:
1.
2.何らかの問題が発生し
3の場合には、トランザクションをコミット(またはロールバックすべてのDB操作を実行し、トランザクション(好ましくはテーブルロック)を開始しますDB更新中)

これにより、両方のテーブルをロックしてすべての操作を実行し、終了することができます。

すでにトランザクションを使用している場合は、どの範囲とレベルを使用していますか?そうでない場合は、取引を導入します。それは問題を解決するはずです。

+1

説明されたシナリオでは、トランザクションはデッドロックを作成する確実な方法です:)通常、ステップ1で(updlock)ヒントを使用してそれらを避けることができます - Table_Nowを読んでください。 – Arvo

+0

私は上記を使用しなかった理由。私は上記のいずれかが動作しない場合は、受信レコードを失うだろう。ロールバックした後、すべてが元に戻ったときに、削除が失敗したとします。 _Table_Now_に挿入することは非常に高い優先度です – JackAss

関連する問題