Estoy frente a un problema de interbloqueo de una función PL/pgSQL en mi base de datos PostgreSQL. Por favor, encontrar la instrucción SQL en el bloque de código (solo ejemplo):Interbloqueo detectado en la función PL/pgSQL
BEGIN
UPDATE accounts SET balance = 0 WHERE acct_name like 'A%';
UPDATE accounts SET balance = balance + 100 WHERE acct_name like '%A';
EXCEPTION WHEN OTHERS THEN RAISE NOTICE SQLERRM;
END;
He encontrado que el estancamiento se produjo durante esta declaración estaba en marcha. Pero no estoy seguro de que haya otras declaraciones tratando de actualizar esta tabla al mismo tiempo (porque no encontré ninguna en mi sistema de registro).
Entonces, ¿es posible que el interbloqueo haya ocurrido dentro de esta declaración? Por lo que sé, si bloqueamos la declaración completa con BEGIN
/END
. Habrá la misma transacción y no se debe bloquear por sí mismo.
¿Tiene algún disparador en las cuentas? ¿También usas bloqueo explícito? – strkol
De forma predeterminada, una transacción puede observar cambios cometidos por otras transacciones. Para obtener más información, consulte [Aislamiento de transacciones] (http://www.postgresql.org/docs/current/static/transaction-iso.html) de la documentación de PostgreSQL. –
@strkol Sí, tengo, pero la declaración en ese desencadenador no está relacionada con esta tabla. Para el bloqueo explícito también es sí. –