ТранзакцияАктивна() в Цикле

1. PerlAmutor 129 20.01.19 14:38 Сейчас в теме
Добрый день, коллеги. Изучал типовой код ERP и обнаружил места, где в паттерне:

НачатьТранзакцию();
Попытка
    ДелаемЧтоТо(); // Тут не хватает БлокировкаДанных
    ЗафиксироватьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
Показать


Вместо "Если ТранзакцияАктивна() Тогда" используется такое:

    Пока ТранзакцияАктивна() Цикл
        ОтменитьТранзакцию();
    КонецЦикла;


Какой в этом сакральный смысл, помимо того, что цикл без пауз, возможно, будет грузить ядро процессора под 100%, а возможно просто будет без конца "дергать" SQL сервер, от чего он тоже может "расстроится" за такое к нему обращение? В общем нужно больше информации по этому поводу.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 20.01.19 15:32 Сейчас в теме
(1) транзакции могут быть вложенными. ОтменитьТранзакцию() во вложенной транзакции не отменяет транзакцию, а только выставляет флаг, что главная(первичная) транзакция должна быть отменена. Финальная отмена будет только при фиксации(отмене) первичной транзакции.
Соответственно, если не отменить все транзакции, то последующие записи в базу будут отменены при последующих фиксациях транзакции.
3. PerlAmutor 129 20.01.19 15:36 Сейчас в теме
(2) Пишут, что это плохая практика - отменять чужие транзакции.
4. spacecraft 20.01.19 15:37 Сейчас в теме
(3) это ведь не во всем коде, в определенных местах обработчиках БСП, где необходимо точно убедиться, что транзакция полностью отменена, что-бы что-то записать в базу.
5. PerlAmutor 129 20.01.19 15:47 Сейчас в теме
(4) Как я понял, в цикле отменять не рекомендуют по той причине, что где-то выше может быть код написанный не опытным программистом таким образом:

Попытка
    Что-тоСделать(); // Тут в цикле отменяют все транзакции
Исключение
    ОтменитьТранзакцию(); // Возникнет новое исключение о том, что транзакция не активна и реальное исключение потеряется.
    ВызватьИсключение;
КонецПопытки;


Стало быть есть и обратная ситуация, когда исключение "сверху" не обработают и зафиксируют верхнюю транзакцию, в этом случае могут не произойти все ожидаемые изменения в базе. И если неполнота изменений критична, то может что-то и порушиться. В таком случае ошибка связанная с неактивной транзакции - наименьшее из зол.
6. spacecraft 20.01.19 16:00 Сейчас в теме
(5) если ориентироваться на то, что могут написать "неопытные программисты", тогда не стоит вообще ничего писать.
Если вызывается код, который может вызвать исключения, то и проверки на это необходимо делать.
Для фиксации транзакции при неизвестном исходе писать проверку "Если ТранзакцияАктивна() Тогда".
Это вообще не критерий для написания циклической отмены транзакции.
А вот если не сделать отмены всех транзакций, то даже ошибку не сохранить в журнале регистрации.
7. PerlAmutor 129 20.01.19 16:10 Сейчас в теме
(6) Теоретически может произойти следующая ситуация. Разработчики написали некий код, который обернули в транзакцию. Внутри этого кода я по своим каким-то причинам взял и отменил все транзакции. Если при этом я не выкину исключений или на верхнем уровне откажутся их ловить, то верхний код может пойди дальше делать записи в базу уже без своих транзакций (я же их прибил) и лишь где-нибудь в конце, после того, как записал в базу сотни тысяч объектов попытается зафиксировать свою транзакцию и выдаст исключение, что она неактивна, но при этом объекты останутся лежать в базе...
8. spacecraft 20.01.19 16:21 Сейчас в теме
(7) а никто и не говорил, что это можно использовать всегда, когда заблагорассудится. Но это иногда оправдано. И привел пример.
Любой инструмент нужно применять по назначению.


(7)
Если при этом я не выкину исключений или на верхнем уровне откажутся их ловить, то верхний код может пойди дальше делать записи в базу уже без своих транзакций

Не много ЕСЛИ для такого примера?
Если "не выкину исключений" даже не буду комментировать.
Если "на верхнем уровне откажутся их ловить", тут 2 случая:
1. Разработчики не предусмотрели что будут вклиниваться "неопытные программисты".
2. Разработчики сами "неопытные программисты".
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот