Добрый день, коллеги. Изучал типовой код ERP и обнаружил места, где в паттерне:
Вместо "Если ТранзакцияАктивна() Тогда" используется такое:
Какой в этом сакральный смысл, помимо того, что цикл без пауз, возможно, будет грузить ядро процессора под 100%, а возможно просто будет без конца "дергать" SQL сервер, от чего он тоже может "расстроится" за такое к нему обращение? В общем нужно больше информации по этому поводу.
НачатьТранзакцию();
Попытка
ДелаемЧтоТо(); // Тут не хватает БлокировкаДанных
ЗафиксироватьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
ПоказатьВместо "Если ТранзакцияАктивна() Тогда" используется такое:
Пока ТранзакцияАктивна() Цикл
ОтменитьТранзакцию();
КонецЦикла;
Какой в этом сакральный смысл, помимо того, что цикл без пауз, возможно, будет грузить ядро процессора под 100%, а возможно просто будет без конца "дергать" SQL сервер, от чего он тоже может "расстроится" за такое к нему обращение? В общем нужно больше информации по этому поводу.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) транзакции могут быть вложенными. ОтменитьТранзакцию() во вложенной транзакции не отменяет транзакцию, а только выставляет флаг, что главная(первичная) транзакция должна быть отменена. Финальная отмена будет только при фиксации(отмене) первичной транзакции.
Соответственно, если не отменить все транзакции, то последующие записи в базу будут отменены при последующих фиксациях транзакции.
Соответственно, если не отменить все транзакции, то последующие записи в базу будут отменены при последующих фиксациях транзакции.
(4) Как я понял, в цикле отменять не рекомендуют по той причине, что где-то выше может быть код написанный не опытным программистом таким образом:
Стало быть есть и обратная ситуация, когда исключение "сверху" не обработают и зафиксируют верхнюю транзакцию, в этом случае могут не произойти все ожидаемые изменения в базе. И если неполнота изменений критична, то может что-то и порушиться. В таком случае ошибка связанная с неактивной транзакции - наименьшее из зол.
Попытка
Что-тоСделать(); // Тут в цикле отменяют все транзакции
Исключение
ОтменитьТранзакцию(); // Возникнет новое исключение о том, что транзакция не активна и реальное исключение потеряется.
ВызватьИсключение;
КонецПопытки;
Стало быть есть и обратная ситуация, когда исключение "сверху" не обработают и зафиксируют верхнюю транзакцию, в этом случае могут не произойти все ожидаемые изменения в базе. И если неполнота изменений критична, то может что-то и порушиться. В таком случае ошибка связанная с неактивной транзакции - наименьшее из зол.
(5) если ориентироваться на то, что могут написать "неопытные программисты", тогда не стоит вообще ничего писать.
Если вызывается код, который может вызвать исключения, то и проверки на это необходимо делать.
Для фиксации транзакции при неизвестном исходе писать проверку "Если ТранзакцияАктивна() Тогда".
Это вообще не критерий для написания циклической отмены транзакции.
А вот если не сделать отмены всех транзакций, то даже ошибку не сохранить в журнале регистрации.
Если вызывается код, который может вызвать исключения, то и проверки на это необходимо делать.
Для фиксации транзакции при неизвестном исходе писать проверку "Если ТранзакцияАктивна() Тогда".
Это вообще не критерий для написания циклической отмены транзакции.
А вот если не сделать отмены всех транзакций, то даже ошибку не сохранить в журнале регистрации.
(6) Теоретически может произойти следующая ситуация. Разработчики написали некий код, который обернули в транзакцию. Внутри этого кода я по своим каким-то причинам взял и отменил все транзакции. Если при этом я не выкину исключений или на верхнем уровне откажутся их ловить, то верхний код может пойди дальше делать записи в базу уже без своих транзакций (я же их прибил) и лишь где-нибудь в конце, после того, как записал в базу сотни тысяч объектов попытается зафиксировать свою транзакцию и выдаст исключение, что она неактивна, но при этом объекты останутся лежать в базе...
(7) а никто и не говорил, что это можно использовать всегда, когда заблагорассудится. Но это иногда оправдано. И привел пример.
Любой инструмент нужно применять по назначению.
(7)
Не много ЕСЛИ для такого примера?
Если "не выкину исключений" даже не буду комментировать.
Если "на верхнем уровне откажутся их ловить", тут 2 случая:
1. Разработчики не предусмотрели что будут вклиниваться "неопытные программисты".
2. Разработчики сами "неопытные программисты".
Любой инструмент нужно применять по назначению.
(7)
Если при этом я не выкину исключений или на верхнем уровне откажутся их ловить, то верхний код может пойди дальше делать записи в базу уже без своих транзакций
Не много ЕСЛИ для такого примера?
Если "не выкину исключений" даже не буду комментировать.
Если "на верхнем уровне откажутся их ловить", тут 2 случая:
1. Разработчики не предусмотрели что будут вклиниваться "неопытные программисты".
2. Разработчики сами "неопытные программисты".
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот