POSTGRES: pg_cancel_backend не всегда работает (причина этого)

В настоящее время я использую postgres в качестве механизма базы данных, который я подключил к веб-приложению.

В некоторых случаях я замечал, что в базе данных накапливаются блокировки, в основном AccessSharedLocks (при выполнении запроса: выберите * из pg_locks).

Одна вещь, которую я заметил, это то, что для отмены процесса, который получает блокировку, вы можете использовать pg_cancel_backend(pid), но иногда я понимаю, что это не всегда работает!! И мне любопытно узнать, почему. Дело в том, что эта функция отправляет SIGINT в базу данных, чтобы корректно закрыть ее? в смысле сразу не выключится?

Есть pg_terminate_backend, но я предпочитаю его не использовать.

Будем признательны за любые советы о том, почему pg_cancel_backend периодически работает (или хотя бы какое-то объяснение).

Спасибо.


person rm12345    schedule 09.09.2018    source источник


Ответы (1)


pg_cancel_backend и pg_terminate_backend посылают сигналы процессу.

Серверная часть очень часто проверяет ожидающие прерывания, но может случиться так, что выполнение находится в месте, где требуется некоторое время, пока это не произойдет.

Отмена запроса не избавит от блокировок, пока транзакция не будет закрыта.

person Laurenz Albe    schedule 10.09.2018
comment
хорошо, спасибо. поэтому, когда вы имеете в виду, что он не избавится от блокировок, пока транзакция не будет закрыта, вы имеете в виду, пока транзакция не будет завершена? Кроме того, если бы я не хотел ждать закрытия транзакции, была бы альтернативой функция pg_terminate_backend? - person rm12345; 11.09.2018
comment
pg_terminate_backend закроет транзакцию. Да, я говорил о завершении сделки. - person Laurenz Albe; 11.09.2018