0

同時に呼び出されるメソッドがあります。そのメソッドでは、メソッドで渡されたパラメーターでいくつかのDELETE操作と操作が行われるトランザクションを定義しました。SELECTこのメソッドを同時に呼び出して、各瞬間に異なるデータを渡そうとしています。エラーが発生しました:

エラー1205:トランザクション(プロセスID)が別のプロセスのリソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します

メソッドの本体は次のようになります。

public void method(param){
  //transaction starts
  // delete operation on table 1
  // select operation on table 1
  // transaction is committed. 
}

トランザクションT1とT2があるとします

この場合、メソッドで渡したパラメーターに基づいて行レベルのロックが適用されるため、このデッドロック状態は発生しないはずです。トランザクションT2が他のデータを削除したい場合、トランザクションT1はそのデータの削除を妨げてはなりません。何が起こっているのかというと、私がキャッチしているSQLExceptionので1つのトランザクションがロールバックされているため、1つのレコードだけが正常に削除されています。なぜこれが機能しないのか誰かが理解できますか?

4

1 に答える 1

0

まず、使用中のインデックスによっては、行レベルのロックを使用する必要があると思われる場合に、一部のデータベースでテーブルレベルのロックを使用する場合があります。したがって、ステップ1は、実際に行レベルのロックを使用していることを確認することです。

次に、削除時に他のテーブルに影響を与える可能性のある自動カスケードを使用していますか?および/または関連する外部キー関係がありますか。この状況でインデックスが欠落していると、問題が発生する可能性もあります。

第3に、インデックスの処理方法が原因で、更新が複数の行に影響を与える場合があります。一部のデータベースは、更新(行の削除など)があるたびにインデックスの「チャンク」をロックします。インデックスのロックが原因で競合が発生している可能性があります。

于 2012-12-04T18:00:41.493 に答える