Können zwei SELECT FOR UPDATE-Anweisungen in derselben Tabelle einen Deadlock verursachen?

Angenommen, zwei gleichzeitige Transaktionen führen die folgenden Abfragen in einer Postgresql-DB aus:

Transaktion A:

SELECT * FROM mytable WHERE id IN (1, 2, 3, 4) FOR UPDATE

Transaktion B:

SELECT * FROM mytable WHERE id IN (6, 3, 2, 1) FOR UPDATE

Kann es zu einem Deadlock kommen, wenn Postgresql Zeilensperren in inkonsistenter Reihenfolge abruft? Z.B. Wenn Postgresql Zeilensperren in der Reihenfolge abruft, in der die IDs in diesem Beispiel angegeben sind, besteht die Möglichkeit eines Deadlocks.

Oder ist Postgresql intern intelligent genug, um Zeilensperren immer gleichzeitig und diskret zu erfassenSELECT FOR UPDATE Anweisungen in derselben Tabelle können sich nicht gegenseitig blockieren (z. B. indem immer Zeilensperren in der Reihenfolge des Primärschlüssels abgerufen werden).

Wenn Postgresqlnicht Gibt es eine Möglichkeit, solche Deadlocks automatisch zu verhindern? Gibt es eine Möglichkeit, die Abfragen zu ändern, um eine solche Situation zu verhindern?

Danke für jede Hilfe!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage