Перейти к содержанию

Нарушение парности использования методов "НачатьТранзакцию()" и "ЗафиксироватьТранзакцию()" / "ОтменитьТранзакцию()" (PairingBrokenTransaction)

Тип Поддерживаются
языки
Важность Включена
по умолчанию
Время на
исправление (мин)
Теги
Ошибка BSL
OS
Важный Да 15 standard

Описание диагностики

Начало транзакции и ее фиксация (отмена) должны происходить в контексте одного метода.

Диагностика не анализирует ветвления (Если, Возврат). Внутри метода она линейно считает две независимые пары вызовов:

  • НачатьТранзакцию / ЗафиксироватьТранзакцию
  • НачатьТранзакцию / ОтменитьТранзакцию

Два отката при одном НачатьТранзакцию дают срабатывание на втором вызове. Это ожидаемое поведение.

Примеры

Правильно

Процедура ЗаписатьДанныеВИБ()

    НачатьТранзакцию();

    Попытка
        ... // чтение или запись данных
        ДокументОбъект.Записать()
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ... // дополнительные действия по обработке исключения
    КонецПопытки;

КонецПроцедуры

Неправильно

Процедура ЗаписатьДанныеВИБ()

    НачатьТранзакцию();
    ЗаписатьДокумент();

КонецПроцедуры;

Процедура ЗаписатьДокумент()

    Попытка
        ... // чтение или запись данных
        ДокументОбъект.Записать()
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
    ... // дополнительные действия по обработке исключения
    КонецПопытки;

КонецПроцедуры

Неправильно — ранний откат внутри Попытка

НачатьТранзакцию();
Попытка
    Если НужноВыйти Тогда
        ОтменитьТранзакцию();
        Возврат;
    КонецЕсли;
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
КонецПопытки;

Ранний ОтменитьТранзакцию() внутри Попытка закрывает пару для НачатьТранзакцию(). Вызов в Исключение остаётся без пары, поэтому появляется сообщение «Отсутствует парный вызов "НачатьТранзакцию" для метода "ОтменитьТранзакцию"».

Не вызывайте ОтменитьТранзакцию() с последующим Возврат внутри Попытка. Если нужно прервать работу до фиксации, выбросьте исключение и откатите транзакцию только в Исключение.

Источники

Сниппеты

Экранирование кода

// BSLLS:PairingBrokenTransaction-off
// BSLLS:PairingBrokenTransaction-on

Параметр конфигурационного файла

"PairingBrokenTransaction": false