Error de 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.

Este error solo existe en los niveles de aislamiento Repeatable Read y Serializable, y es esos niveles funcionando según su diseño: PostgreSQL no pudo producir un resultado consistente con las garantías que pediste, así que abortó tu transacción en lugar de devolver silenciosamente algo incorrecto.

Qué significa este error

Las dos variantes corresponden a los dos niveles:

En cualquier caso la transacción se revirtió y, como dice el HINT, probablemente tendría éxito si simplemente se ejecuta de nuevo. El SQLSTATE es 40001 en ambos casos.

Causas comunes

Cómo diagnosticarlo

Cómo solucionarlo

🔍 Lectura relacionada: Niveles de aislamiento de transacciones en la práctica — qué garantiza cada nivel, el write skew, y una sección completa sobre reintentar correctamente.