E 'possibile rilasciare automaticamente un blocco in PostgreSQL?
-
19-09-2019 - |
Domanda
sto testando la tolleranza ai guasti di un sistema di ActiveMQ configurato come JDBC Master / Slave. In questa configurazione c'è un database Postgres e due mediatori - uno è il broker maestro, l'altro è un broker di schiavo. Il modo in cui questo meccanismo funziona è il maestro tira fuori un blocco esclusivo su un tavolo nel db. Lo schiavo cerca di fare anche questo e aspetta fino a quando il blocco diventa disponibile. Se il maestro muore, il blocco dovrebbe essere rilasciato e lo schiavo si farà carico. Tuttavia, se il padrone perde la connettività di rete con il database, il blocco è mai uscito con un conseguente scenario di stallo. Ciò che sembra essere richiesto qui è un modo per dire Postgres per rilasciare automaticamente il blocco, se non rinnovati entro un determinato periodo di tempo. Il POSA 3 libro di modelli di progettazione chiama questo il modello di Leasing. E 'possibile ottenere Postgres per fare questo? In caso contrario, non gli altri fornitori di database supportano?
Soluzione
Questo problema di connessione non è una situazione di stallo, questa è perduto.
Un deadlock si verifica quando due transazioni tentano di bloccare le risorse precedentemente bloccati da un l'altro. PostgreSQL
rileva queste situazioni.
Nel tuo caso, master
blocca una risorsa, attende slave
per master
, e attende master
per l'input dell'utente, che non ha mai ricevuto, perché si perde la connessione.
Ogni volta PostgreSQL
rileva una connessione persa, è rollback automaticamente la sua operazione.
Per controllare il rilevamento della perdita di connessione, è possibile utilizzare il seguente PostgreSQL
tcp_keepalives_idle (integer)
Su sistemi che supportano l'opzione socket
TCP_KEEPIDLE
, specifica il numero di secondi tra l'invio keepalive su una connessione inattivo. Un valore di zero utilizza il default del sistema. SeTCP_KEEPIDLE
non è supportato, questo parametro deve essere pari a zero. Questo parametro viene ignorato per le connessioni effettuate tramite un socket di dominio Unix.
tcp_keepalives_interval (integer)
Su sistemi che supportano l'opzione socket
TCP_KEEPINTVL
, specifica per quanto tempo, in secondi, di attesa per una risposta a un keepalive prima di ritrasmettere. Un valore di zero utilizza il default del sistema. SeTCP_KEEPINTVL
non è supportato, questo parametro deve essere pari a zero. Questo parametro viene ignorato per le connessioni effettuate tramite un socket di dominio Unix.
tcp_keepalives_count (integer)
Su sistemi che supportano l'opzione socket
TCP_KEEPCNT
, specifica quanti keepalives può essere perso prima che la connessione viene considerato morto. Un valore di zero utilizza il default del sistema. SeTCP_KEEPCNT
non è supportato, questo parametro deve essere pari a zero. Questo parametro viene ignorato per le connessioni effettuate tramite un socket di dominio Unix.