Errore PostgreSQL: could not serialize access

ERROR:  could not serialize access due to concurrent update

-- oppure, a livello Serializable:
ERROR:  could not serialize access due to read/write dependencies among transactions
DETAIL:  Reason code: Canceled on identification as a pivot, during commit attempt.
HINT:  The transaction might succeed if retried.

Questo errore esiste solo ai livelli di isolamento Repeatable Read e Serializable, ed è quei livelli che lavorano come previsto: PostgreSQL non è riuscito a produrre un risultato coerente con le garanzie che hai richiesto, quindi ha interrotto la tua transazione invece di restituire silenziosamente qualcosa di sbagliato.

Cosa significa questo errore

Le due varianti corrispondono ai due livelli:

In entrambi i casi la transazione è stata sottoposta a rollback e, come dice l'HINT, avrebbe probabilmente successo se semplicemente eseguita di nuovo. Lo SQLSTATE è 40001 in entrambi i casi.

Cause comuni

Come diagnosticarlo

Come risolverlo

🔍 Lettura correlata: Livelli di isolamento delle transazioni in pratica — cosa garantisce ciascun livello, il write skew e un'intera sezione sul riprovare correttamente.