Ошибка PostgreSQL 3B000: savepoint_exception — точки сохранения
- Ошибка транзакции
ERROR: savepoint exception (SQLSTATE 3B000)при попытке работы с точками сохранения. - Откат к несуществующей, ранее освобожденной (released) или испорченной точке сохранения.
- Сбои в сложных транзакционных цепочках 1С:Предприятие при возникновении исключений в попытке-исключении платформы.
1. Проверка логики создания и освобождения Savepoints
Точка сохранения становится недействительной после ее явного освобождения через RELEASE SAVEPOINT или после завершения всей транзакции:
BEGIN;
SAVEPOINT sp_step1;
-- Выполнение операций DML...
-- Неверно:
RELEASE SAVEPOINT sp_step1;
ROLLBACK TO SAVEPOINT sp_step1; -- Вызовет ошибку 3B001 / 3B000
-- Корректно:
SAVEPOINT sp_step1;
-- Выполнение операций...
-- При ошибке:
ROLLBACK TO SAVEPOINT sp_step1;
COMMIT;2. Обработка ошибок в транзакциях 1С
В коде 1С конструкция Попытка ... Исключение генерирует внутренние субтранзакции. Если внутри транзакции происходит аварийная ошибка уровня СУБД, вся транзакция переходит в статус InFailedSqlTransaction:
-- Проверка статуса транзакции
SELECT txid_current_if_assigned(), txid_status(txid_current_if_assigned());3. Очистка состояния сессии после сбоя точки сохранения
-- Если транзакция помечена как сбойная, выполните полный откат:
ROLLBACK; Частые вопросы (FAQ)
Чем отличается RELEASE SAVEPOINT от ROLLBACK TO SAVEPOINT?
ROLLBACK TO SAVEPOINT откатывает все изменения данных, совершенные после установки точки сохранения, сохраняя саму точку активной. RELEASE SAVEPOINT уничтожает саму точку сохранения, фиксируя изменения в рамках текущей транзакции.
Создают ли вложенные блоки BEGIN в 1С реальные вложенные транзакции в PostgreSQL?
Нет. В PostgreSQL все вложенные транзакции 1С (НачатьТранзакцию() внутри другой транзакции) реализуются исключительно через точки сохранения (SAVEPOINT).
Сколько точек сохранения можно создать в рамках одной транзакции?
Количество ограничено объемом оперативной памяти, однако создание десятков тысяч savepoints (subxids) приводит к деградации производительности механизма Transaction Status (pg_subtrans).
Почему после ошибки SAVEPOINT нельзя выполнять SELECT запросы?
При возникновении необработанной ошибки ядро блокирует выполнение любых команд, кроме ROLLBACK или ROLLBACK TO SAVEPOINT.