0
<executionStack>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000cb01b3329478b4bbe70e115ebcb8f5f4a8610e7e">
(@1 varchar(8000),@2 varchar(8000),@3 varchar(8000),@4 varchar(8000))UPDATE [TABLE_NAME] set [END_TIME] = @1,[ERROR] = @2  WHERE [USER_ID]=@3 AND [SESSION_ID]=@4 AND [END_TIME] IS NULL     </frame>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000ef595e01eab1df10c694910f5810afb17d814663">
UPDATE TABLE_NAME SET END_TIME='2012-03-30 12:07:45', ERROR='FALSE' WHERE USER_ID='username' AND SESSION_ID='095d42ad-67d8-444f-8e51-4576f6b940d8' AND END_TIME IS NULL     </frame>
 </executionStack>

上記は、顧客がサイトから私に送信したデッドロック トレースのサニタイズされたインスタンスです。私が理解しているように、2 つのコミットが同じテーブルに順不同でアクセスしようとすると、デッドロックが発生します。

ただし、この例では、テーブルは 1 つしかなく、これらの SQL ステートメントを実行するコードは、それらをキューから取り出して順番に実行しています。

なぜこのデッドロックになるのでしょうか?

4

1 に答える 1

1

DBMS によって異なりますが、2 つの異なるユーザー セッションが別のセッションも自由にアクセスしようとしているリソース (行またはテーブル) をロックしようとすると、デッドロックが発生する可能性があります。コミットは発生する必要はありません。

Session 1 :  lock  <row x>   (e.g. read for update)
Session 2 :  lock  <row y>   (e.g. read for update)
Session 1 :  fetch <row y>
Session 2 :  fetch <row x>

フェッチまたはその他の操作でロック解除されたアクセスまたはクリーンな読み取りが必要な場合は、デッドロックが発生します。

于 2012-07-19T14:19:54.653 に答える