bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

[NEW] Недопустимо подавлять ошибки БД внутри транзакции

Open kuzyara opened this issue 2 years ago • 0 comments

Описание проблемы, ошибки, которую надо диагностировать

При обработке исключений внутри транзакции недопустимо подавлять ошибки БД. Ошибки БД - это ошибки, вызывающие в ТЖ событие SDBL Func=setRollbackOnly

Событие в технологическом журнале 32:50.662017-32011,SDBL,4,process=1cv8,OSThread=9864,Usr=DefUser,DBMS=DBV8DBEng,DataBase=InfoBase75,Trans=0,Func=Transaction,Func=setRollbackOnly

Примеры таких ошибок:

Неправильно

// Процедура - обработчик события "ПередЗаписью".
//
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
  
    НачатьТранзакцию();
    Попытка
        ЗафискироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию(); // явная отмена тразакции
    КонецПопытки;
     
    Пока Выборка.Следующий() Цикл
        Попытка
            Объект.Записать(); // ПриЗаписи Отказ = Истина - вызывает откат неявной тразакции
        Исключение
        КонецПопытки;
    КонецЦикла;
     
    Попытка
        Запрос = Новый Запрос("Выбрать 1/0");  
        Запрос.Выполнить(); // ошибка БД
    Исключение
    КонецПопытки;
     
КонецПроцедуры

Правильно Правильно - вызывать исключение после отмены явной или не использовать попытку.

В случае возникновения ошибки, ломающей транзакцию - необходимо прокидывать её наверх с помощью метода ВызватьИсключение, так как последующее обращение к БД в незакрытой тразакции вызовет ошибку «В данной транзакции уже происходили ошибки».

Настройка ТЖ для отлова событий RollbackTransaction

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
    <dump create="false" type="0" prntscrn="false"/>
    <log history="2" location="D:\Database\Log">
        <property name="all"/>
        <event>
            <eq property="name" value="SDBL"/>
            <eq property="func" value="setRollbackOnly"/>
        </event>
    </log>
</config>

Общее правило состоит в следующем: если при выполнении транзакции имели место ошибки базы данных, то следует отменить всю транзакцию в целом и, в случае необходимости, повторить попытку ее выполнения с самого начала.

Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы

ИТС: Ошибки базы данных и транзакции Безопасная работа с транзакциями во встроенном языке Команда "ЗафискироватьТранзакцию();" отменяет транзакцию Ошибка «В данной транзакции уже происходили ошибки» в программах 1С:Предприятие 8

Параметры диагностики

Тип Статья на русском

  • [x] :ant: Ошибка
  • [ ] :cop: Уязвимость
  • [ ] :guardsman: Потенциальная уязвимость
  • [ ] :poop: Качество кода
  • [ ] :trollface: Другое

Важность Статья на русском

  • [ ] :broken_heart: Блокирующая / Blocker
  • [x] :heart: Критическая / Critical
  • [ ] :yellow_heart: Важная / Major
  • [ ] :blue_heart: Незначительная / Minor
  • [ ] :green_heart: Информационная / Info
  • [ ] :revolving_hearts: Другое

Тэги Статья на русском

  • [x] STANDARD - "Нарушение стандартов 1С"
  • [ ] LOCKINOS - "Не будет работать в другой ОС"
  • [ ] SQL - "Проблема с запросом"
  • [ ] PERFORMANCE - "Проблема производительности"
  • [ ] BRAINOVERLOAD - "Непонятный код"
  • [ ] BADPRACTICE - "Плохая практика программирования"
  • [ ] CLUMSY - "Излишние действия"
  • [ ] DESIGN - "Ошибка в проектировании"
  • [ ] SUSPICIOUS - "Подозрительный код"
  • [x] UNPREDICTABLE - "Непредсказуемо работающий код"
  • [ ] DEPRECATED - "Устаревшая функциональность"
  • [ ] ERROR - "Ошибочная конструкция"
  • [ ] LOCALIZE - "Проблемы локализации"

Время на исправление (минут)

3 минуты

Дополнительная информация

Пример встречающейся ошибки image

Как воспроизвести: image

kuzyara avatar Nov 02 '22 04:11 kuzyara