¿Es posible liberar automáticamente un bloqueo en PostgreSQL?
-
19-09-2019 - |
Pregunta
Estoy probando la tolerancia a fallos de un sistema de ActiveMQ configurado como JDBC maestro / esclavo. En esta configuración hay una base de datos PostgreSQL y dos corredores - uno es el agente principal, el otro es un corredor de esclavos. El funcionamiento de este mecanismo es el maestro lleva a cabo un bloqueo exclusivo en una tabla en el PP. El esclavo trata de hacer esto también, y espera hasta que la cerradura esté disponible. Si el maestro muere, el bloqueo debe ser liberado y el esclavo se hará cargo. Sin embargo, si el maestro pierde la conectividad de red con la base de datos, el bloqueo se libera no resulta en un escenario de estancamiento. Lo que parece ser requerido aquí es una manera de contar Postgres para liberar automáticamente el bloqueo si no se renueva en un plazo determinado de tiempo. La POSA 3 libro de patrones de diseño llama a esto el patrón de leasing. ¿Es posible obtener Postgres para hacer esto? Si no es así, apoyan otros proveedores de bases de datos que?
Solución
Este problema de conexión no es un callejón sin salida, esta se ha perdido.
Un interbloqueo se produce cuando dos transacciones tratan de bloquear los recursos previamente bloqueados por la otra. PostgreSQL
detecta estas situaciones.
En su caso, master
encierra un recurso, espera slave
para master
, y espera master
para la entrada del usuario, que nunca recibe porque se pierde la conexión.
Siempre que PostgreSQL
detecta una conexión perdida, que Rollbacks su transacción automáticamente.
Para el control de detección de pérdida de conexión, puede utilizar el siguiente PostgreSQL
tcp_keepalives_idle (integer)
En los sistemas que soportan la opción de conector
TCP_KEEPIDLE
, especifica el número de segundos entre el envío de mensajes de actividad en una conexión de otro modo inactivo. Un valor de cero usa el sistema por defecto. Si no se admiteTCP_KEEPIDLE
, este parámetro debe ser cero. Este parámetro se ignora para las conexiones realizadas a través de un socket Unix-dominio.
tcp_keepalives_interval (integer)
En los sistemas que soportan la opción de conector
TCP_KEEPINTVL
, especifica cuánto tiempo, en segundos, para esperar una respuesta a un mantenimiento de conexión antes de retransmitir. Un valor de cero usa el sistema por defecto. Si no se admiteTCP_KEEPINTVL
, este parámetro debe ser cero. Este parámetro se ignora para las conexiones realizadas a través de un socket Unix-dominio.
tcp_keepalives_count (integer)
En los sistemas que soportan la opción de conector
TCP_KEEPCNT
, especifica cuántos mensajes de actividad puede perderse antes de considerar la conexión muertos. Un valor de cero usa el sistema por defecto. Si no se admiteTCP_KEEPCNT
, este parámetro debe ser cero. Este parámetro se ignora para las conexiones realizadas a través de un socket Unix-dominio.