È una funzione PostgreSQL che termina completamente la connessione di un processo, chiudendo la sessione e annullando la transazione in corso. Accetta come parametro il PID, ovvero l'ID del processo attivo.

Cosa fa questa funzione?

La funzione invia un segnale SIGTERM al processo, che viene terminato immediatamente. A differenza di pg_cancel_backend, la sessione viene chiusa e il client dovrà riconnettersi.

⚠️ Usa il codice con cautela

SELECT pg_terminate_backend(1234)

Qual è la differenza con pg_cancel_backend()?

Preferisci sempre pg_cancel_backend come primo tentativo. Ricorri a pg_terminate_backend se la sessione non risponde al cancel.

Caso d'uso con pg_stat_activity

Nella pratica il PID si ricava dalla vista pg_stat_activity. Questo esempio termina tutte le sessioni in stato idle in transaction da più di 10 minuti:

idle in transaction significa che la sessione ha aperto una transazione con BEGIN o START TRANSACTION ma non sta eseguendo nessuna query — sta semplicemente aspettando, con la transazione ancora aperta. Perchè è pericoloso? Finché la transazione resta aperta, la sessione può tenere lock su righe o tabelle che ha modificato, bloccando tutte le altre sessioni che vogliono accedere a quelle stesse risorse.

⚠️ Usa il codice con cautela

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle in transaction'
  AND now() - state_change > interval '10 minutes';

Note

Richiede il ruolo pg_signal_backend (o superuser) per agire su sessioni altrui.

-- mostra se l'utente corrente ha il ruolo `pg_signal_backend`
SELECT
rolsuper AS is_superuser,
pg_has_role(CURRENT_USER, 'pg_signal_backend', 'MEMBER') AS has_pg_signal_backend
FROM pg_roles
WHERE rolname = CURRENT_USER;
  • La funzione restituisce true se il segnale è stato inviato con successo, false se il processo non esiste.
  • A differenza di pg_cancel_backend, il terminate è efficace anche su sessioni in stato idle in transaction.