最近、デッドロックの問題が発生しました。システムの2つの部分が同じ時間に同じテーブルを更新します。1つはトランザクション内の複数の行を更新(「UP1」と名付け)、もう1つ(「UP2」と名付け)は「update ...whereid」のようなSQLを使用します。の (...)"。
これは、sql "update ... where id in(...)"のIDの順序が正しくないためと思われます(例: "5,6,2,3,4,1")。トランザクションでは、更新アクションは「1,2,3,4,5,6」の順序で動作します。「UP1」がID「1,2,3,4」と「UP2」更新ID「5,6」を更新する場合、「UP1」は「UP2」と「UP2」によってロックされているID5を必要とします。 「UP1」によってロックされているID2が必要なので、デッドロックが発生します。
私の質問は、dbは行を1つずつロックし、SQLまたはトランザクションが完了したときにのみそれらを解放するのですか?そうでない場合、トランザクションの開始時または「where id in(...)」SQLですべての行をロックできないのはなぜですか。また、更新された行を1つずつ解放できないのはなぜですか。
役立つ返信をお待ちしております、thx。