私は、PostgreSQLのデッドロックについて少し読んでいます。UPDATE実行時のPostgreSQLのデッドロック
典型的なデッドロックの例は次のとおりです。私は、コードを変更
-- Transaction 1
UPDATE customer SET ... WHERE id = 1
UPDATE customer SET ... WHERE id = 2
-- Transaction 2
UPDATE customer SET ... WHERE id = 2
UPDATE customer SET ... WHERE id = 1
しかし、どのような場合には、次のように:
-- Transaction 1
UPDATE customer SET ... WHERE id IN (1, 2)
-- Transaction 2
UPDATE customer SET ... WHERE id IN (1, 2)
は、ここでデッドロックの可能性でしょうか?
本質的に私の質問は:は2番目のケースでは、PostgreSQLは行を1つずつロックするか、WHERE
条件でカバーされるスコープ全体をロックしますか?
ありがとうございます!
ありがとうございます! 上記の例はデッドロックを引き起こす可能性があります(私たちは両方のトランザクションで行が処理される順序がわからないため)? – vyakhir
デッドロックが発生する可能性はありますが、それはまれです。最初の例(明示的に異なる注文を選択する)とは対照的に、どこに共通するのでしょうか。デッドロックを排除するには、テーブルを更新するすべてのトランザクションの期間中、テーブルレベルの適切な強度のロックを取ることによって、デッドロックを排除することができます。ただし、その治癒は、病気よりも悪い可能性があります。詳細については、私が参照したドキュメントのセクションを参照してください。 – kgrittn
しかし、行が更新された後、PostgreSQLのリリースロックは解除されますが、UPDATE文全体はまだ終了していませんか? つまり、 のようなステートメントがある場合は、UPDATE ... WHERE id IN(1,2,3,4,5) postgresqlの更新後、たとえばid = 1の行とid = 2、それは行id = 1をリリースしますか?はいの場合は、必要に応じて行をどのようにロールバックするのでしょうか? – vyakhir