Как остановить зависшую транзакцию в PostgreSQL
Сегодня PostgreSQL является одной из самых популярных СУБД, и, судя по новостям, многие крупные конторы переходят на ее использование с коммерческих продуктов признанных лидеров софтверного фронта. Поэтому думаю, что пошаговое решение ситуации с остановкой зависшей транзакции будет полезно многим. Я столкнулся с таковой, применяя транзакцию, создающую внешний ключ к заблокированной таблице.
Итак, что нам нужно сделать:
- Найти ID заблокированной таблицы;
- Найти ID транзакции, которая зависла;
- Попытаться остановить её корректно, прервать в случае оказания сопротивления.
Допустим, запрос заблокировал таблицу “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);