PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché la transazione serializzabile PostgreSQL considera questo un conflitto?

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.