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

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

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

ORA-02049 1С:Предприятие и СУБД

Ошибка ORA-02049: timeout: distributed transaction waiting for lock — решение

Обновлено: 26.08.2026 · Официальная документация ↗
  • Распределенная транзакция через DBLINK или интеграционный шлюз прерывается с ошибкой ORA-02049: timeout: distributed transaction waiting for lock.
  • В alert.log появляются записи о сомнительных распределенных транзакциях (In-Doubt Distributed Transactions).
  • Вью DBA_2PC_PENDING содержит зависшие транзакции в статусе PREPARED или COLLECTING.

1. Поиск сессий, удерживающих распределенные блокировки

SELECT s.sid, s.serial#, s.username, s.osuser, s.program, l.type, l.lmode, l.request
FROM v$lock l
JOIN v$session s ON l.sid = s.sid
WHERE l.type IN ('TX', 'TM') AND l.block > 0;

2. Проверка зависших транзакций 2-Phase Commit (2PC)

SELECT local_tran_id, global_tran_id, state, status 
FROM dba_2pc_pending;

3. Ручная принудительная фиксация или откат транзакции

Если транзакция зависла в распределенном протоколе двухфазной фиксации:

-- Принудительный откат
ROLLBACK FORCE 'LOCAL_TRAN_ID_HERE';

-- Или принудительный коммит
COMMIT FORCE 'LOCAL_TRAN_ID_HERE';

4. Увеличение таймаута ожидания распределенных блокировок

ALTER SYSTEM SET distributed_lock_timeout = 120 SCOPE=BOTH;
💡 Практика специалистов: Не завершайте сессии с распределенными транзакциями через kill -9 на уровне ОС. Это гарантированно переведет распределенную транзакцию в состояние In-Doubt и заблокирует таблицы на удаленном сервере.

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

Что означает параметр DISTRIBUTED_LOCK_TIMEOUT?

Он задает время в секундах (по умолчанию 60 сек), в течение которого распределенная транзакция ждет освобождения ресурса, заблокированного другой сессией, перед выбросом ORA-02049.

Почему возникают In-Doubt транзакции?

Они возникают при внезапном разрыве сети или падении одного из узлов СУБД в фазе между PREPARE и COMMIT двухфазного протокола фиксации.

Как очистить запись из DBA_2PC_PENDING после принудительного отката?

Выполните процедуру: EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id');

Может ли фоновый процесс RECO автоматически устранить ORA-02049?

Процесс RECO (Recoverer) автоматически опрашивает удаленные узлы и разрешает состояние in-doubt транзакций, как только сетевая связность восстанавливается.

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