Как остановить зависшую транзакцию в PostgreSQL

Сегодня PostgreSQL является одной из самых популярных СУБД, и, судя по новостям, многие крупные конторы переходят на ее использование с коммерческих продуктов признанных лидеров софтверного фронта. Поэтому думаю, что пошаговое решение ситуации с остановкой зависшей транзакции будет полезно многим. Я столкнулся с таковой, применяя транзакцию, создающую внешний ключ к заблокированной таблице.

Итак, что нам нужно сделать:

  1. Найти ID заблокированной таблицы;
  2. Найти ID транзакции, которая зависла;
  3. Попытаться остановить её корректно, прервать в случае оказания сопротивления.

Допустим, запрос заблокировал таблицу “mytable”. Получим её ID:

SELECT oid FROM pg_class WHERE relname='mytable';

К примеру, ID таблицы “mytable” равен 100. Теперь найдём ID транзакции:

SELECT pid FROM pg_locks WHERE relation=100;

Теперь, имея ID транзакции (скажем, он равен 200), попытаемся её остановить:

SELECT pg_cancel_backend(200);

Если она всё еще существует, значит по-хорошему не хочет, и придется ее прервать:

SELECT pg_terminate_backend(200);
Дата публикации: 2017-01-09