2つの同時トランザクションがPostgresqlDBで次のクエリを実行するとします。
トランザクションA:
SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE
トランザクションB:
SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE
Postgresqlが一貫性のない順序で行ロックを取得するためにデッドロックが発生する可能性はありますか?たとえば、Postgresqlがこの例でIDが指定されている順序で行ロックを取得する場合、デッドロックが発生する可能性があります。
または、Postgresqlは、同じテーブル上の同時の個別SELECT FOR UPDATE
のステートメントが互いにデッドロックできないように(たとえば、主キーの順序で常に行ロックを取得することによって)常に行ロックを取得するのに十分な内部インテリジェントですか?
Postgresqlがそのようなデッドロックの発生を自動的に防止しない場合、そのような状況を防ぐためにクエリを変更する方法はありますか(たとえば、PostgresqlがIDが指定された順序で行ロックを取得する場合、IDを一貫してソートすることでデッドロックを防ぐことができます)?
助けてくれてありがとう!