---
layout: post
title: Как остановить зависшую транзакцию в PostgreSQL
tags: [postgres,memo]
categories: [database]
---

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

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

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

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

{% highlight sql %}
SELECT oid FROM pg_class WHERE relname='mytable';
{% endhighlight %}

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

{% highlight sql %}
SELECT pid FROM pg_locks WHERE relation=100;
{% endhighlight %}

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

{% highlight sql %}
SELECT pg_cancel_backend(200);
{% endhighlight %}

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

{% highlight sql %}
SELECT pg_terminate_backend(200);
{% endhighlight %}

Add article about dropping PG table locks
Add article about dropping PG table locks
