Referencia técnica independienteSitio oficial
  • Software y sistemas
  • Base de datos

40P01

PostgreSQL 40P01 en base de datos: bloqueo mutuo entre transacciones

Verificada con fuentes3 fuentesRevisada 3 oct 2026
¿Viene un técnico? Mira los 2 pasos que debe enseñarte
Trace

Evidencia vinculada a esta decisión

Ver fuente: PostgreSQL 18 Appendix A: Error Codes

Nivel 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.

  1. 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.

  2. 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.

  1. Sentencias que participaron

    Sin herramientas especiales

    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

  2. Repetición de la transacción abortada

    Sin herramientas especiales

    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

  3. Registro de esperas de bloqueo

    Requiere herramientas

    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. 1

    PostgreSQL 18 Appendix A: Error Codes

    PostgreSQL Global Development Group · 2026 · official_doc

  2. 2

    PostgreSQL transaction isolation

    PostgreSQL Global Development Group · 2026 · official_doc

  3. 3

    PostgreSQL ROLLBACK

    PostgreSQL Global Development Group · 2026 · official_doc

Fuentes: PostgreSQL 18 Appendix A: Error Codes · PostgreSQL transaction isolation · PostgreSQL ROLLBACKrevisado 2026-10-03 · verificado

¿Te ha resultado útil esta ficha?