PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum betrachtet die serialisierbare PostgreSQL-Transaktion dies als Konflikt?

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.