Puoi risolvere questo problema con il seguente indice:
CREATE INDEX accounts_user_idx ON accounts(user_id);
Dato che ci sono così pochi dati nella tua tabella di esempio, dovrai dire a PostgreSQL di utilizzare una scansione dell'indice:
SET enable_seqscan=off;
Ora il tuo esempio funzionerà!
Se ti sembra una magia nera, dai un'occhiata ai piani di esecuzione delle query del tuo SELECT
e UPDATE
dichiarazioni.
Senza l'indice entrambi utilizzeranno una scansione sequenziale sulla tabella, leggendo così tutte le righe nella tabella . Quindi entrambe le transazioni finiranno con un SIReadLock
su tutta la tavola.
Ciò provoca l'errore di serializzazione.