2

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

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

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

NAME='BLUE'そのため、あるプロセスがinでレコードを UPDATE しようとすると_Table_Now_、最初に現在の行をupdate にNAME='BLUE'入れ、以前に存在していた行を から削除する必要があります。_Table_History__Table_Now__Table_History_

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

ガイドしてください!

4

2 に答える 2

1

デッドロックは基本的に、プロセス A がプロセス B に依存し、プロセス B がプロセス A に依存している場合を意味します。したがって、A は B が終了すると開始\続行され、A が終了すると B は開始\続行されます。

発生している可能性があるのはテーブル (または行) ロックであるため、SQL はテーブルを更新する前に行をロックして、更新中に他のプロセスがその行にアクセスしようとしないようにします。

挿入\更新\削除をどのように行っているかについて、より具体的に教えてください。このシナリオでデッドロックが発生することはありません。

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

于 2012-05-03T10:30:54.757 に答える
0

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

更新の順序を正しく理解していれば、次のようになります
。 1. Table_Now の行を読み取ります
。 2. Table_History の行を更新し
ます。 3. Table_Now の行を更新します
。 4. Table_History の行を削除します。

トランザクションまたはロックを誤って使用している場合、これは危険な順序になる可能性があります。

デッドロックを回避するには、実行する必要があるプロセスごとに次のことを行います
。 1. トランザクションを開始します (できればテーブル ロック)
2. すべての DB 操作を実行します
3. トランザクションをコミットします (または、DB の更新中に問題が発生した場合はロールバックします)

これにより、各プロセスが両方のテーブルをロックし、すべての操作を実行して終了することが保証されます。

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

于 2012-05-03T12:42:59.423 に答える