Короткие транзакции и каноничный шаблон
Директивный
v8std#std783диагностикаBeginTransactionBeforeTryCatchдиагностикаCommitTransactionOutsideTryCatchдиагностикаPairingBrokenTransactionдиагностикаWrongUseOfRollbackTransactionMethod
Правило
Заголовок раздела «Правило»Транзакции держите короткими: внутри — только работа с данными ИБ. Запрещены внутри транзакции:
- обращения к внешним системам (HTTP-вызовы, отправка почты, файловые операции по сети);
- интерактивные действия и ожидания (диалоги,
Приостановить); - долгие вычисления, которые можно выполнить до начала транзакции.
Оформление — только каноничным шаблоном: НачатьТранзакцию() перед Попытка,
ЗафиксироватьТранзакцию() — последним оператором блока Попытка,
ОтменитьТранзакцию() — первым в Исключение, затем ВызватьИсключение;.
Пока транзакция открыта, удерживаются блокировки: все параллельные сеансы, которым
нужны те же данные, ждут. Долгая транзакция с HTTP-вызовом внутри означает, что
таймаут внешней системы (30–300 секунд) становится временем блокировки ваших
документов — очередь проведения, ошибки «конфликт блокировок», зависшие сеансы.
Нарушенный шаблон (фиксация вне Попытка, отсутствие отката) оставляет
транзакцию открытой или прячет ошибку.
Вложенные транзакции — это счётчик
Заголовок раздела «Вложенные транзакции — это счётчик»В 1С нет настоящих вложенных транзакций: НачатьТранзакцию() внутри уже открытой
транзакции лишь увеличивает счётчик, а реальная фиксация происходит на самом
внешнем ЗафиксироватьТранзакцию(). Отсюда два следствия:
ОтменитьТранзакцию()на любом уровне вложенности помечает на откат всю транзакцию, а не «свой» кусок;- исключение, проглоченное внутри вложенного блока, не спасает внешнюю транзакцию — она уже помечена, и внешняя фиксация упадёт с «В данной транзакции уже происходили ошибки».
Каждая процедура, работающая с транзакцией, использует каноничный шаблон и пробрасывает исключение наружу — тогда вложенные вызовы безопасны: любой сбой докатывается до внешнего уровня и откатывает всё целиком. Решение «часть данных необязательна» принимается структурой вызовов (две транзакции), а не проглатыванием ошибки внутри одной.
Когда не применять
Заголовок раздела «Когда не применять»Исключений из шаблона оформления нет. Для длительности: если бизнес-операция требует записи во внешнюю систему «атомарно» с записью в ИБ — не растягивайте транзакцию, а стройте идемпотентный сценарий с повтором: записать локально → отправить вовне → отметить факт отправки.