- Software y sistemas
- Base de datos
40P01
PostgreSQL 40P01 en base de datos: bloqueo mutuo entre transacciones
Evidencia vinculada a esta decisión
Ver fuente: PostgreSQL 18 Appendix A: Error CodesNivel de riesgo
Atención alta
Comprobaciones mínimas; se recomienda asistencia profesional.
Urgencia
Media — atiéndelo hoy
Respuesta rápida
Dos o más transacciones se esperaban entre sí y PostgreSQL abortó una para desbloquear las demás. Revisa qué sentencias participaron y repite la transacción completa abortada; para evitarlo, haz que todas tomen los bloqueos en el mismo orden.
Seguridad primero
Antes de continuar
- No sigas repitiendo solo la sentencia que falló: la transacción entera se abortó y hay que repetirla completa o el resultado puede quedar incoherente.
Puedes hacerlo con seguridad
- Sentencias que participaron
- Repetición de la transacción abortada
- Registro de esperas de bloqueo
Deja estas tareas a un profesional cualificado
- No intentes esta tarea profesional: Unificar el orden de bloqueo
- No intentes esta tarea profesional: Acortar transacciones abiertas
Lo que un técnico debe poder justificar
Viene un técnico a casa
Estos son los pasos que tiene que hacer y enseñarte. Márcalos mientras trabaja: si se salta pasos, no aceptes el cambio de pieza.
No son instrucciones para que abras o manipules el equipo. Son las comprobaciones que deben sostener una conclusión técnica.
Unificar el orden de bloqueo
Qué haceEl desarrollador hace que todas las transacciones que tocan esos objetos los bloqueen en el mismo orden y con el modo más restrictivo que necesiten desde el principio.
Te tiene que enseñarel antes y después del orden de las sentencias.
Por escritola prueba de carga o concurrencia que ya no reproduce el bloqueo.
Acortar transacciones abiertas
Qué haceEl equipo elimina transacciones que quedan abiertas esperando, por ejemplo, la respuesta de una persona.
Te tiene que enseñarla duración antes y después.
Por escritoel cambio aplicado.
Antes de aceptar una pieza o reparación
Aún no ha demostrado nada. No aceptes un cambio de pieza solo por el código.
Sigue estos pasos
Aviso: Sigue el orden documentado. Un código identifica el sistema afectado, pero por sí solo no demuestra qué pieza está averiada.
Sentencias que participaron
- Quién:
- tú, como desarrollador.
- Cómo:
- conserva el mensaje completo con Detail que devolvió el driver y busca la misma hora en el registro del servidor.
- Resultado que importa:
- qué transacciones, tablas y sentencias aparecen.
- Si siempre aparecen las mismas dos sentencias:
- confirma un problema de orden entre ellas; ahí está la corrección.
- Si cambian cada vez:
- apunta a transacciones largas que acumulan bloqueos; revisa su duración.
- Evidencia a conservar:
- mensaje completo y extracto del registro.
Evidencia: PostgreSQL error and notice fields · PostgreSQL 18 explicit locking
Repetición de la transacción abortada
- Quién:
- tú, como desarrollador.
- Cómo:
- haz ROLLBACK y repite la transacción completa desde el principio, incluida la lógica que decide qué escribir, con un número limitado de intentos.
- Resultado que importa:
- si la repetición termina bien.
- Si termina bien:
- confirma que era un conflicto puntual.
- Si se repite con frecuencia:
- indica un patrón de acceso que hay que corregir, no reintentar más.
- Evidencia a conservar:
- número de intentos y resultado.
Evidencia: PostgreSQL ROLLBACK · PostgreSQL 18 serialization failure handling · PostgreSQL 18 explicit locking
Registro de esperas de bloqueo
- Quién:
- el DBA o administrador.
- Cómo:
- activa log_lock_waits si no lo está; registra las esperas que superan deadlock_timeout.
- Resultado que importa:
- qué sesiones esperan bloqueos y durante cuánto.
- Si aparecen transacciones abiertas mucho tiempo:
- apunta a ellas como origen de las esperas.
- Si no hay esperas largas registradas:
- descarta transacciones colgadas y vuelve al orden de bloqueos.
- Evidencia a conservar:
- líneas del registro con hora.
Cambiar parámetros del servidor es tarea del DBA. Si no eres el responsable, no lo hagas: pídelo por el canal del equipo.
Evidencia: PostgreSQL 18 explicit locking · PostgreSQL 18 lock management settings
Situación no resuelta
Si el error persiste, no sigas probando por tu cuenta. Mira qué tiene que hacer y enseñarte el técnico.
Técnico virtual
¿Sigue apareciendo 40P01 tras comprobarlo?
Este recorrido usa el código exacto y tus respuestas para elegir una prueba, su resultado esperado y la siguiente bifurcación.
Dónde se aplica este código
Un código solo tiene significado dentro del producto y la versión correctos.
Ámbito principal
- Sistema
- Software y sistemas
- Marca
- PostgreSQL
- Tipo de producto
- Base de datos
Variantes conocidas del código
- deadlock_detected
- PostgreSQL 40P01
- SQLSTATE 40P01
Qué significa
El apéndice A asigna 40P01 a deadlock_detected, en la clase 40 (reversión de transacción). PostgreSQL detecta que cada transacción tiene un bloqueo que otra necesita y aborta una de ellas; cuál es difícil de predecir. Puede ocurrir con bloqueos de fila aunque no uses bloqueo explícito. La comprobación se lanza tras esperar deadlock_timeout, por defecto un segundo. El código señala un conflicto de concurrencia, no un fallo del servidor.
Advertencias y condiciones de parada
- Atención altaadvertencia editorial
No sigas repitiendo solo la sentencia que falló: la transacción entera se abortó y hay que repetirla completa o el resultado puede quedar incoherente.
Evidencia: PostgreSQL 18 serialization failure handling · PostgreSQL 18 explicit locking
Síntomas y causas
Causas probables · en orden
- Orden de actualización distinto entre transaccionesFrecuente
Dos transacciones modifican las mismas filas o tablas en orden inverso. La documentación lo pone como ejemplo típico y se repite con el mismo par de sentencias.
Evidencia: PostgreSQL 18 explicit locking
- Bloqueo inicial más débil que el necesarioPosible
Una transacción toma primero un bloqueo suave y luego necesita uno más fuerte sobre el mismo objeto mientras otra hace lo mismo.
Evidencia: PostgreSQL 18 explicit locking
Fuentes y referencias técnicas
- 1
PostgreSQL 18 Appendix A: Error Codes
PostgreSQL Global Development Group · 2026 · official_doc
- 2
PostgreSQL transaction isolation
PostgreSQL Global Development Group · 2026 · official_doc
- 3
PostgreSQL Global Development Group · 2026 · official_doc
¿Te ha resultado útil esta ficha?