同時に呼び出されるメソッドがあります。そのメソッドでは、メソッドで渡されたパラメーターでいくつかの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つのレコードだけが正常に削除されています。なぜこれが機能しないのか誰かが理解できますか?