ПОСТГРЕССЫ: pg_cancel_backend не всегда работает (причина этого) - PullRequest
0 голосов
/ 09 сентября 2018

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

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

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

Существует pg_terminate_backend, но я предпочитаю не использовать это.

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

спасибо.

1 Ответ

0 голосов
/ 10 сентября 2018

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

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

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

...