Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

PG_ORPHANED_PREPARED_TX Linux / DevOps

Траблшутинг зависших двухфазных транзакций (2PC) в PostgreSQL

Обновлено: 24.08.2026
  • Таблицы перестают очищаться автовакуумом (Autovacuum), вызывая стремительный рост Bloat и угрозу Wraparound.
  • Таблицы остаются заблокированными, хотя в pg_stat_activity нет активных выполняющихся запросов.
  • Использование менеджеров распределенных транзакций (XA, Bitronix, Narayana, Spring JTA).

1. Поиск зависших двухфазных транзакций

SELECT gid, prepared, owner, database,
       age(transaction) AS age_in_xids,
       now() - prepared AS duration
FROM pg_prepared_xacts
ORDER BY prepared ASC;

2. Анализ удерживаемых блокировок подготовленной транзакцией

SELECT l.locktype, l.mode, l.granted, c.relname
FROM pg_locks l
LEFT JOIN pg_class c ON c.oid = l.relation
WHERE l.transactionid = (SELECT transaction FROM pg_prepared_xacts WHERE gid = 'target_gid');

3. Принудительное завершение брошенной транзакции

В зависимости от бизнес-логики выполните откат или подтверждение транзакции:

-- Откат зависшей подготовленной транзакции
ROLLBACK PREPARED 'target_gid';

-- Или принудительное применение изменений:
-- COMMIT PREPARED 'target_gid';

4. Отключение 2PC (если распределенные транзакции не используются)

В postgresql.conf установите:

max_prepared_transactions = 0
systemctl restart postgresql
💡 Практика специалистов: Настройте обязательный алерт в Prometheus/Zabbix на проверку count(pg_prepared_xacts) > 0 с длительностью жизни более 5 минут.

Частые вопросы (FAQ)

Почему подготовленные транзакции (PREPARE TRANSACTION) не закрываются при разрыве TCP-соединения?

Такова специфика протокола 2PC (Two-Phase Commit). Подготовленная транзакция сохраняется на диске в WAL и удерживает блокировки бессрочно, пока внешний координатор транзакций явно не выполнит COMMIT PREPARED или ROLLBACK PREPARED.

Чем опасна забытая транзакция 2PC для PostgreSQL?

Она замораживает горизонт транзакций (xmin). Из-за этого Autovacuum не может удалить ни одну мертвую строку, созданную после старта этой транзакции, что приводит к разрастанию всей базы данных.

Полезные материалы
Рекомендуем