bsl-language-server
bsl-language-server copied to clipboard
[NEW] Недопустимо подавлять ошибки БД внутри транзакции
Описание проблемы, ошибки, которую надо диагностировать
При обработке исключений внутри транзакции недопустимо подавлять ошибки БД. Ошибки БД - это ошибки, вызывающие в ТЖ событие 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 минуты
Дополнительная информация
Пример встречающейся ошибки
Как воспроизвести: