====== Как остановить зависшую транзакцию в 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);