Sie können dieses Problem mit dem folgenden Index beheben:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Da Ihre Beispieltabelle so wenige Daten enthält, müssen Sie PostgreSQL anweisen, einen Index-Scan zu verwenden:
SET enable_seqscan=off;
Jetzt funktioniert Ihr Beispiel!
Wenn Ihnen das nach schwarzer Magie vorkommt, werfen Sie einen Blick auf die Abfrageausführungspläne Ihres SELECT
und UPDATE
Aussagen.
Ohne den Index verwenden beide einen sequentiellen Scan der Tabelle, wobei alle Zeilen in der Tabelle gelesen werden . Beide Transaktionen enden also mit einem SIReadLock
auf dem ganzen Tisch.
Dies löst den Serialisierungsfehler aus.