powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / откатывается транзакция пойманая на OptimisticLockException
39 сообщений из 39, показаны все 2 страниц
откатывается транзакция пойманая на OptimisticLockException
    #40104292
hck2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Spring, длинная spring batch транзакция сверху, в классе есть вот такой метод

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    void forceTableUpdate(String table, Integer pid){
        boolean skipAgreements = getConf().getBoolean(IOParameters.SKIP_AGREEMENTS, false);
        if (skipAgreements) {
            log.info("Enabled skip agreements parameter, skipping agreements execution");
            return;
        }
        AgreementDaoService service = SpringServiceGate.getInstance().getBean(AgreementDaoService.class);

        log.info("force agreement execution for table=" + table);
        try {
            if (!service.scheduleExecutionForTable(pid, table)) {
                throw new RuntimeException("Could not set next time for agreement execution on table=" + table);
            }
        } catch(OptimisticLockException e) {
            log.warn("OptimisticLockException catched for pid " + pid);
        }
    }



изначально он был без REQUIRES_NEW аннотации и OptimisticLockException, их добавил я после того как начали случатся эксепшены на тему OptimisticLock. если конкурирующий процесс уже дернул scheduleExecutionForTable(), моему процессу уже можно ничего не делать. так вот, мои добавки проблему не решили, я вижу в логе надпись "OptimisticLockException catched for pid ", но spring batch транзакция так и откатывается. я понял почему REQUIRES_NEW аннотация не отрабатывает (метод из того же класса вызывается, вынес метод в отдельный класс), но вот почему catch(OptimisticLockException e) не помог не понимаю.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104294
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck2
но вот почему catch(OptimisticLockException e) не помог не понимаю.
Наверное потому что над scheduleExecutionForTable тоже @Transactional шлепнут.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104298
hck2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
hck2
но вот почему catch(OptimisticLockException e) не помог не понимаю.
Наверное потому что над scheduleExecutionForTable тоже @Transactional шлепнут.

над scheduleExecutionForTable не шлепнут, но есть над всем AgreementDao, который в конце концов scheduleExecutionForTable() дергает. получается AgreementDao присоединят свою транзакцию к контексту спринг батч транзакции, фейлится, помечает транзакцию на роллбэк и только потом я ловлю exception в forceTableUpdate() ?
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104317
hck2, да, все так. Если убрать @Transactional над DAO, то должно заработать без отката транзакций. Правда по хорошему, строго говоря - Hibernate говорит что при любом его исключении сессию нужно очищать, она становится не пригодной. Сам я не знаю когда это может вылезти боком..
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104352
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hck2

над scheduleExecutionForTable не шлепнут, но есть над всем AgreementDao, который в конце концов scheduleExecutionForTable() дергает. получается AgreementDao присоединят свою транзакцию к контексту спринг батч транзакции, фейлится, помечает транзакцию на роллбэк и только потом я ловлю exception в forceTableUpdate() ?

у спринга для @Transactional конвенция такая, что в случае исключений во "вложенных" (тут специально в кавычках, потому что оно обычно под "nested" для транзакций нечто иное подразумевается) транзакциях, оно при checked exceptions не фейлит транзакцию, а при RuntimeException фейлит, там есть Transactional#noRollbackFor но из опыта могу сказать что оно совершенно бесполезное, например для вашего OptimisticLockException ситуация на самом деле следующая:
- был вызван flush
- flush не прошел
- то что после этого хранится в контексте хибера вообще непонятно и как это компенсировать тоже непонятно, т.е. если бы OptimisticLockException вам транзакцию не фейлил, то вы бы все равно commit бы не смогли выполнить - оно бы столкнулось на том же месте
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104956
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
незачем над верхнеуровневыми слоями транзакции клепать вот и все,они должны быть точечными,если не получатеся - значит сломана архтектура

недавно такое разгребал - на всех контроллерах на всех сервисах бездумно вывешены транзакции
в итоге обычный каунт вызывал ошибку персистенс контекста при попытке передать id в метод справедливая ошибка дедач сучность пассед ту персист( там еще речь конечно была о каскадных операциях,которые у нас по дефолту все любят вставлять как ALL)

просто программисты в общей своей массе вообще не понимаю что такое @Transactional
в большинстве люди думают что это транзакция в бдшку и отсюда ошибки
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104957
localhost8080незачем над верхнеуровневыми слоями транзакции клепать вот и все,они должны быть точечными,если не получатеся - значит сломана архтектураЭто как раз и есть основной use case для @Transactional - его и нужно ставить над верхнеуровневыми слоями (Service Facade) а не над низкоуровневыми (Repository). Ибо чаще всего 1 бизнес транзакция (т.е. вызов сервиса) = 1 БД транзакция.
localhost8080
просто программисты в общей своей массе вообще не понимаю что такое @Transactional
в большинстве люди думают что это транзакция в бдшку и отсюда ошибки
Мм.. ну этот механизм и создает "транзакцию в бдшку" :) Ну и если на этот момент не создана ORM сессия, то еще и ее создает.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104971
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
Это как раз и есть основной use case для @Transactional - его и нужно ставить над верхнеуровневыми слоями (Service Facade) а не над низкоуровневыми (Repository). Ибо чаще всего 1 бизнес .

Это как раз и не есть этот функционал ,ты бы почитал книги и хотя бы немного разобрался что такое @Transational
только идиоты ,которые вообще не понимают что происходит ставят его на верхнем уровне - в итоге получая тормоза изза копий персистенс сучностей и дерти чекинга.
Я вангую ты даже понятия не имееш что можно делать по другому ,вы спецы однодневки - ставите @Transactional везде где его еще нет и потом удивляетесь что ваше приложение падает на тыще юзеров)

стасян могу тебе дать совет что почитать - покамест ты профан в теме JPA
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104972
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
Мм.. ну этот механизм и создает "транзакцию в бдшку" :) Ну и если на этот момент не создана ORM сессия, то еще и ее создает.

а ты знаешь как конткрентно это происходит от А до Я и что будет если у тебя на верхнем уровне стоит эта анотация?
этот механизм не создает никаких транзакций в бдшку ,он вообще ни как не связан с БД

может быть ты что то слышал про unit work - загугли что это - может придет осознание того что такое @Transactional

пс.печаль вот такие спецы у нас скорей всего сеньеры где то трудятся) ты же сеньер стасян?)
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104975
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
скорей всего сеньеры где то трудятся)
вот давай плиз про технологии а не про должности, зарплату и то где трудятся)
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104980
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080
скорей всего сеньеры где то трудятся)
вот давай плиз про технологии а не про должности, зарплату и то где трудятся)

ну почитай что он пишет- типо этот механизм создает транзакцию в бд)
ок а если нет анотации @Transactional то со слов стасяна и транзакция не создаться в бд))

мало того стасян плохо учил уроки по бд и не знает того,что явно или неявно любой запрос выполняется в рамках транзакции )

пс. реально жалко тех ребят,у кого стасян работает и скорей всего еще ему и деньги за это платят)
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40104997
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080

ну почитай что он пишет- типо этот механизм создает транзакцию в бд)
ок а если нет анотации @Transactional то со слов стасяна и транзакция не создаться в бд))

мало того стасян плохо учил уроки по бд и не знает того,что явно или неявно любой запрос выполняется в рамках транзакции )

пс. реально жалко тех ребят,у кого стасян работает и скорей всего еще ему и деньги за это платят)


Чет вы оба неправы: я же тебе показывал вот тут: 22349359 , что транзакции нужно лепить над бизнес-кодом, а над репозиторями и DAO тоже нужно, но особого смысла не имеет. Что касается самих "транзакций в БД": в JDBC (java.sql) нет нигде явного вызова который бы создавал/начинал транзакцию (сюрприз), есть только вызов фиксации или отката, например для хибера "начало транзакции" - это захват соединения из пула и выключение автокоммита, хотя если его хорошо попросить, то он этого делать не будет, а будет надеяться, что автокоммит и так выключен.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105003
Андрей Панфилов
Чет вы оба неправы: я же тебе показывал вот тут: 22349359 , что транзакции нужно лепить над бизнес-кодом, а над репозиторями и DAO тоже нужно, но особого смысла не имеет
Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет.

localhost8080 похоже недавно узнал что @Transactional может управлять ORM сессией и всем хвастается :)
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105006
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет.
Пока есть Стас, который не считает верным лепить в бизнес-коде, в DAO лепить нужно.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105011
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
Stanislav Bashkyrtsev
Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет.
Пока есть Стас, который не считает верным лепить в бизнес-коде, в DAO лепить нужно.

именно про бизнес код и речь,но гугломисты ( я так называют прогреров уровня стас) клепают @Transactional на методе,в котором происходит вызов еще 100 методов,99 из которых вообще не интересен перстистенс контекст,получается 99% ресурсов тратиться в пустоту( это и хранение копий сучностией и дерти чекинг) пока не отработают все вложенные методы - контекст не вытолкнется
именно поэтому нужно думать куда втыкать эти анотации ,а не как любит стас прям над классом контроллера)
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105026
Андрей Панфилов
Stanislav Bashkyrtsev
Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет.
Пока есть Стас, который не считает верным лепить в бизнес-коде, в DAO лепить нужно.
Мне кажется наоборот - пока есть Стас их нужно запрещать на уровне DAO. Потому как если кто-то забудет проставить @Transactional выше по стеку, то мы получим понятное исключение. Если же разрешать проставлять на DAO, то случайно можем забыть проставить над сервисом - и втихую получим N транзакций вместо одной. А такие баги сложно исследовать.
localhost8080@Transactional на методе,в котором происходит вызов еще 100 методов,99 из которых вообще не интересен перстистенс контекст,получается 99% ресурсов тратиться в пустоту( это и хранение копий сучностией и дерти чекинг) пока не отработают все вложенные методы - контекст не вытолкнетсяСтолько заблуждений в одном предложении.. И я бы рассказал в чем они, да устал уже в пустоту говорить.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105053
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stanislav Bashkyrtsev
Столько заблуждений в одном предложении.. И я бы рассказал в чем они, да устал уже в пустоту говорить.

ну куда уж нам до стасика гугломиста,который думал что @Transactional тразакцию в бд открывает.
Стасян тебе близко к чему то серьезному подпускать нельзя ,иначе получится как сберспасибо
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105076
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов
Stanislav Bashkyrtsev
Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет.
Пока есть Стас, который не считает верным лепить в бизнес-коде, в DAO лепить нужно.

Стас прав по одной простой причине. Если вы используете @Transactional только на слое DAO, а на слое сервисов не используете, и если в одном методе сервиса вызывается несколько разных методов DAO, то каждый из них будет выполняться в отдельной транзакции. При этом нет гарантии что успешно все выполнятся. Т. е. есть риск сломать консистентность данных в БД. Удалив аннотации с сервисных методов мембер localhost8080 похоже сломал логику программы.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105079
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Мне кажется наоборот - пока есть Стас их нужно запрещать на уровне DAO. Потому как если кто-то забудет проставить @Transactional выше по стеку, то мы получим понятное исключение. Если же разрешать проставлять на DAO, то случайно можем забыть проставить над сервисом - и втихую получим N транзакций вместо одной. А такие баги сложно исследовать.


Кмк здесь палка о двух концах:
- в целом понятно, что дергать DAO без наличия активной транзакции (а я выше упоминал, что в принципе поднять транзакцию ничего не стоит по ресурсам, кроме того что оно будет соединение держать дольше положенного) особо смысла не имеет: даже если мы что-то успешно понавыбирали, то далеко не факт, что мы сможем дернуть свойства (транзакции-то уже нет), ну а при сохранении выбранного оно будет или падать или уходить в тормознутый merge
- если @Transactional в DAO не лепить вообще, то "клиент" получит возможность перехватывать исключения и не откатывать транзакцию (прямо как у ТС), ничем хорошим это не светит, более того, мы таким образом вытаскиваем кишки нашего DAO на "клиента", здесь было бы хорошо, если бы была полноценная поддержка NESTED, но увы... получается что не лепить вообще так себе идея, лучше лепить MANDATORY
- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаев
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105080
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Osipov
Стас прав
какой из двоих Стас прав?
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105087
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
Roman Osipov
Стас прав
какой из двоих Стас прав?
а пусть ответят спорящие, где бы они писали try catch
))
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105101
Андрей Панфилов
Stanislav Bashkyrtsev
Мне кажется наоборот - пока есть Стас их нужно запрещать на уровне DAO. Потому как если кто-то забудет проставить @Transactional выше по стеку, то мы получим понятное исключение. Если же разрешать проставлять на DAO, то случайно можем забыть проставить над сервисом - и втихую получим N транзакций вместо одной. А такие баги сложно исследовать.


Кмк здесь палка о двух концах:
- в целом понятно, что дергать DAO без наличия активной транзакции (а я выше упоминал, что в принципе поднять транзакцию ничего не стоит по ресурсам, кроме того что оно будет соединение держать дольше положенного) особо смысла не имеет: даже если мы что-то успешно понавыбирали, то далеко не факт, что мы сможем дернуть свойства (транзакции-то уже нет), ну а при сохранении выбранного оно будет или падать или уходить в тормознутый merge
Ну да, не факт. Хотя гарантий нет что нам нужны будут какие-то ленивые свойства. Кстати, соединение не обязательно будет захвачено - мы можем обернуть db pool в LazyConnectionDataSourceProxy который может отложить это до 1ого запроса. Но думаю что большинство настраивает размер db pool'a по кол-ву потоков, так что не страшно даже если захватим Connection лишний раз.
Андрей Панфилов- если @Transactional в DAO не лепить вообще, то "клиент" получит возможность перехватывать исключения и не откатывать транзакцию (прямо как у ТС)Эт да.. Хотя как ты выше писал если кто-то отловит исключение внутри @Transactional и продолжит работу с сессией, то снова отхватит тот же optimistic exception. Так что как будто бы не супер страшно, но согласен что баги возможны в таком раскладе.
Андрей Панфиловболее того, мы таким образом вытаскиваем кишки нашего DAO на "клиента"Про кишки не понял.
Андрей Панфилов- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаевНу а иначе управление транзакциями становится каким-то очень скрытным и неявным процессом - не каждый разработчик поймет что с ними происходит. И у меня возникала бы постоянно паранойя - это специально сделали или просто забыли про транзакции. А утиль - очень простое и явное решение в таких случаях.
Андрей Панфилов
Roman Osipov
Стас прав
какой из двоих Стас прав?
Слишком большая концентрация Стасов :)
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105112
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev

Андрей Панфилов- если @Transactional в DAO не лепить вообще, то "клиент" получит возможность перехватывать исключения и не откатывать транзакцию (прямо как у ТС)
Эт да.. Хотя как ты выше писал если кто-то отловит исключение внутри @Transactional и продолжит работу с сессией, то снова отхватит тот же optimistic exception. Так что как будто бы не супер страшно, но согласен что баги возможны в таком раскладе.
Андрей Панфиловболее того, мы таким образом вытаскиваем кишки нашего DAO на "клиента"Про кишки не понял.
Ну вот лично я знаю каким образом спринг забороть чтобы транзакции не фейлились, при этом еще могу найти способ компенсировать OptimisticLockException - там не то что бы сложно, но вот DAO - это абстракция, естественно она будет забарываться (причем успешно) за счет знаний конкретной реализации - вот и получилось что верхний слой знает про работу нижнего, что в свою очередь означает что абстракция у нас с дырками (ну просто представьте себе что DAO делает один отдел/компания, а бизнес-логику - другой)

Stanislav Bashkyrtsev

Андрей Панфилов- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаев
Ну а иначе управление транзакциями становится каким-то очень скрытным и неявным процессом - не каждый разработчик поймет что с ними происходит. И у меня возникала бы постоянно паранойя - это специально сделали или просто забыли про транзакции. А утиль - очень простое и явное решение в таких случаях.)

У вас ожидания слишком уж тенденциозные, действительность она совсем другая:
- о том что @Transactional работает только через прокси знают только те, кто с этим сталкивался (чинил баги или тыкнули носом на ревью), разработчик средней руки о таком поведении ни сном ни духом, т.е. предоставляемое API уже само по себе так себе
- API действительно работает через *опу - вот у меня есть вполне себе законные основания полагать, что там где я начал транзакцию, там я и должен принимать решение о фиксации или откате, однако, текущее API исходит из того, что ничерта непонятно, поэтому давайте будем защищаться от "говнокода"

И вот дальше вы пытаетесь размазать ответственность за кривой API между всеми (давайте в DAO не лепить @Transactional), а мое мнение заключается в том, что пусть хотя бы один слой работает правильно, а тот, кто делает неправильно, пусть с этим и разбирается.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105117
Андрей Панфилов
Stanislav Bashkyrtsev

пропущено...
Ну а иначе управление транзакциями становится каким-то очень скрытным и неявным процессом - не каждый разработчик поймет что с ними происходит. И у меня возникала бы постоянно паранойя - это специально сделали или просто забыли про транзакции. А утиль - очень простое и явное решение в таких случаях.)

У вас ожидания слишком уж тенденциозные, действительность она совсем другая:
- о том что @Transactional работает только через прокси знают только те, кто с этим сталкивался (чинил баги или тыкнули носом на ревью), разработчик средней руки о таком поведении ни сном ни духом, т.е. предоставляемое API уже само по себе так себеНу в своих проектах это один из обязательных ликбезов которые я провожу с каждым разработчиком. Это слишком важно чтоб не знать. Но доходит не до всех сразу. Точнее почти до всех не сразу. Но в итоге все обязаны знать как работают прокси. А пока не знают - ну на ревью найдем. У меня по этому пунктик - я всегда обращаю на это внимание.

Но допустим мы работаем по сценарию "разработчики об этом не знают, поэтому не ставим @Transactional над сервисом" - что мы этим достигаем? Еще больше вероятность багов, еще более сложное управление транзакциями, еще больше непониманий о том как это все работает. Это ведь более сложная и неявная схема.

Андрей ПанфиловИ вот дальше вы пытаетесь размазать ответственность за кривой API между всеми (давайте в DAO не лепить @Transactional), а мое мнение заключается в том, что пусть хотя бы один слой работает правильно, а тот, кто делает неправильно, пусть с этим и разбирается.@Transactional это не часть DAO слоя. То что мы где-то ожидаем что у нас всего один вызов DAO и поэтому мы не ставим @Transactional над сервисом - это неправильное определение обязанностей DAO. DAO не имеет права определять границы транзакции, это не часть DAO абстракции. Как в общем-то и обработка оптимистических блокировок - это часть бизнес логики.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105128
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
ну просто представьте себе что DAO делает один отдел/компания, а бизнес-логику - другой)
так бывает в жизни?
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105177
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет обработки исключений.

Обычная практика:
- определяются кастомные исключения;
- слой DAO может отдавать только эти кастомные исключения;
- слой сервисов (бизнес логики) понимает и обрабатывает эти кастомные исключения.

Таким образом, кастомные исключения и объекты DTO определяют контракт взаимодействия слоя DAO со слоем сервисов. При замене слоя DAO достаточно, чтобы новый DAO удовлетворял этому контракту.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105264
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Osipov,
Нарушение FK это кастомные?
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105292
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev

Но допустим мы работаем по сценарию "разработчики об этом не знают, поэтому не ставим @Transactional над сервисом" - что мы этим достигаем? Еще больше вероятность багов, еще более сложное управление транзакциями, еще больше непониманий о том как это все работает. Это ведь более сложная и неявная схема.

Андрей ПанфиловИ вот дальше вы пытаетесь размазать ответственность за кривой API между всеми (давайте в DAO не лепить @Transactional), а мое мнение заключается в том, что пусть хотя бы один слой работает правильно, а тот, кто делает неправильно, пусть с этим и разбирается.
@Transactional это не часть DAO слоя. То что мы где-то ожидаем что у нас всего один вызов DAO и поэтому мы не ставим @Transactional над сервисом - это неправильное определение обязанностей DAO. DAO не имеет права определять границы транзакции, это не часть DAO абстракции. Как в общем-то и обработка оптимистических блокировок - это часть бизнес логики.
Вы пытаетесь рассказать довольно странную историю на мой взгляд. Из вашего рассказа следует примерно следующее:
- вот есть некий слой который в итоге производит манипуляции в БД (тут на самом деле уже странно, поскольку чтобы заставить хибер что-то сделать в БД до вызова flush нужно очень сильно постараться, а если мы вызываем flush явно, то это на самом деле так себе затея, к тому же это касается исключительно ваших проектов, а не вообще всех подряд, я, к примеру, принимал участие в проекте где вызывать flush() считалось западно)
- вы смотрите в код хибера (точнее спринга) и наблюдаете, что при определенном стечении обстоятельств в вашем проекте оно выкинет более-менее понятное исключение, причем нужно подчеркнуть что именно в вашем проекте и на вполне определенных версиях (здесь как в соседнем топике: 22385060 , chpasha считает что нужно следоать жавадоку, а вы его игнорируете), откуда принимаете решение что нужно делать именно так как вы увидели и несете это знание в массы, здесь есть кое-какие проблемы:
-- если DAO - это самостоятельный слой, то никаких предположений относительно того, как его будут вызывать он делать не должен, т.е. вариантов развития событий в нем всего два: принять данность как есть (т.е. использовать @Trsnsactional), либо отвергнуть (@Transactional(MANDATORY)), у него, как самостоятельного слоя, есть вполне определенная задача: всегда работать корректно
-- оба упомянутых варианта всегда работают правильно вне зависимости от того что вы там себе придумали, отличаются они только тем, насколько мы уважаем "клиента" - еще раз повторюсь: заставлять "клиента" приседать с транзакциями на ровном месте - это путь вникуда
- если у вас разработчики не понимают где начинаются бизнес-транзакции, а где заканчиваются, то это проблема исключительно разработчиков и их руководства
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105294
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Нарушение FK это кастомные?

чет у меня есть подозрение, что если по уму делать, то "кастомных" исключений получится где-то полста (которые, к слову сказать, уже в JPA присутствуют), если не добрая сотня, но если скроить, то можно сделать исключение "хрен его знает что тут вообще произошло" и обойтись только им
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105295
Андрей Панфилов , как-то очень абстрактно написано, я перестаю понимать что мы обсуждаем. Какие-то непонятные предположения про меня, про команду и про руководство.. Не понимаю откуда они взялись и на чем основываются.

Я наверно зря писал что отвергаю @Transactional на DAO - я имел в виду именно умолчания, т.е. @Transactional(REQUIRED). А вот @Transactional(MANDATORY) как раз и выливается в то что DAO не определяет границы транзакций - это делают выше по стеку. Это меня устраивает. Так что складывается впечатление что мы говорим об одном и том же.

Только для меня ставить @Transactional(MANDATORY) и не ставить @Transactional на DAO вообще с практической точки зрения - одно и то же. Потому как мы в любом случае получаем исключение. А ты, насколько я понимаю, подходишь к этому более строго и требуешь проставлять @Transactional(MANDATORY) чтоб получить более понятное исключение.

Я даже начинаю склоняться к тому чтобы тоже начать проставлять MANDATORY. Получается, что таким образом я буду документировать для других что сделал явный выбор не управлять транзакциями на этом уровне. Меня только лишние прокси в стеке раздражают..

Хотя меня продолжает смущает вот эта формулировка:
Андрей Панфилов- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаевТут ты как будто говоришь что клиент не должен управлять транзакциями. Но MANDATORY именно к этому и приводит. Что хорошо.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105304
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
PetroNotC Sharp
Нарушение FK это кастомные?

чет у меня есть подозрение, что если по уму делать, то "кастомных" исключений получится где-то полста (которые, к слову сказать, уже в JPA присутствуют), если не добрая сотня, но если скроить, то можно сделать исключение "хрен его знает что тут вообще произошло" и обойтись только им
я не о том.
Я вот вообще не вижу кастомных.
Например у оракле есть 30 исключений. Как пример выше - нарушение FK при вставке.
Эти 30 это же НЕ кастомные.
Так в старой парадигме они просто пробрасываются наверх через DAO или через репозиторий.
Наверх туда где БЛ.
Думаю что спринг бут парадигме тоже самое.
Это будет логично.
А вот в слое БЛ можно и кастомные родить хоть 500 штук
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105317
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Андрей Панфилов , как-то очень абстрактно написано, я перестаю понимать что мы обсуждаем. Какие-то непонятные предположения про меня, про команду и про руководство.. Не понимаю откуда они взялись и на чем основываются.
А как иначе писать, если DAO - это абстракция. Если у меня в DAO не хибернейт закрытый спрингом, а что-то другое, что наличие активной транзакции не проверяет, мне нужно в DAO лепить @Transactional или нет? А если у меня в методах DAO несколько взаимодействий с БД, мне нужно лепить @Transactional или нет? А если дело касается только вашего определенного кейса, тогда почему вы несете в массу "знания" что в DAO лепить @Transactional не нужно?
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105321
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Osipov
Насчет обработки исключений.

Обычная практика:
- определяются кастомные исключения;
- слой DAO может отдавать только эти кастомные исключения;
- слой сервисов (бизнес логики) понимает и обрабатывает эти кастомные исключения.

Таким образом, кастомные исключения и объекты DTO определяют контракт взаимодействия слоя DAO со слоем сервисов. При замене слоя DAO достаточно, чтобы новый DAO удовлетворял этому контракту.


это тоже не всегда работает - потому что например спринг перехватывает ваши исключения и если вы делаете norollBakcFOr =myExeption.class
вас ждет сюрприз в некторых случаях ,так как кастомный эксепшен перехватит спринг и в это время вы тут же получите
UnexpectedRollbackException и как следвствие откат транзакции ,хотя по логике ожидаете что отката не будет

вообще я лично думаю что флоу,которое строится на эксепшенах это признак плохой архитектуры
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105333
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080
Roman Osipov
Насчет обработки исключений.

Обычная практика:
- определяются кастомные исключения;
- слой DAO может отдавать только эти кастомные исключения;
- слой сервисов (бизнес логики) понимает и обрабатывает эти кастомные исключения.

Таким образом, кастомные исключения и объекты DTO определяют контракт взаимодействия слоя DAO со слоем сервисов. При замене слоя DAO достаточно, чтобы новый DAO удовлетворял этому контракту.


это тоже не всегда работает - потому что например спринг перехватывает ваши исключения и если вы делаете norollBakcFOr =myExeption.class
вас ждет сюрприз в некторых случаях ,так как кастомный эксепшен перехватит спринг и в это время вы тут же получите
UnexpectedRollbackException и как следвствие откат транзакции ,хотя по логике ожидаете что отката не будет

вообще я лично думаю что флоу,которое строится на эксепшенах это признак плохой архитектуры
ты научился писать только технические посты?
Вот что java животворящая делает))
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105336
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфилов,

-- если DAO - это самостоятельный слой, то никаких предположений относительно того, как его будут вызывать он делать не должен, т.е. вариантов развития событий в нем всего два: принять данность как есть (т.е. использовать @Trsnsactional), либо отвергнуть (@Transactional(MANDATORY)), у него, как самостоятельного слоя, есть вполне определенная задача: всегда работать корректно

Вот здесь ошибка в рассуждениях. Не может и не должен слой DAO всегда работать корректно. Поэтому обрабатывать некорректную работу слоя DAO должен клиент.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105344
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Osipov,
Ты видел его как самостоятельный слой? Кому он нужен?
Это просто сущности с геттерами
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105349
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
localhost8080
пропущено...


это тоже не всегда работает - потому что например спринг перехватывает ваши исключения и если вы делаете norollBakcFOr =myExeption.class
вас ждет сюрприз в некторых случаях ,так как кастомный эксепшен перехватит спринг и в это время вы тут же получите
UnexpectedRollbackException и как следвствие откат транзакции ,хотя по логике ожидаете что отката не будет

вообще я лично думаю что флоу,которое строится на эксепшенах это признак плохой архитектуры
ты научился писать только технические посты?
Вот что java животворящая делает))


Те кто хоть что-то умеет - пишет посты по сути топика, те кто не умеет - бла-бла-бла посты. Как-то так.
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105354
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Osipov,
А ты че влез в наш с ним разговор?
Тебе выше вопрос технический про то как ты писал самодостаточный DAO.
Борешься за место?))))
...
Рейтинг: 0 / 0
откатывается транзакция пойманая на OptimisticLockException
    #40105447
Андрей Панфилов
А как иначе писать, если DAO - это абстракция. Если у меня в DAO не хибернейт закрытый спрингом, а что-то другое, что наличие активной транзакции не проверяет, мне нужно в DAO лепить @Transactional или нет? А если у меня в методах DAO несколько взаимодействий с БД, мне нужно лепить @Transactional или нет? А если дело касается только вашего определенного кейса, тогда почему вы несете в массу "знания" что в DAO лепить @Transactional не нужно?
Я ж уже согласился с тобой, что на DAO ставить @Transactional(MANDATORY) - это более правильно. Итого от самого правильного до самого неправильного:
1. Ставить @Transactional(MANDATORY)
2. Не ставить @Transactional
3. Ставить @Transactional(REQUIRES)
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / откатывается транзакция пойманая на OptimisticLockException
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]