|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Spring, длинная spring batch транзакция сверху, в классе есть вот такой метод Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
изначально он был без REQUIRES_NEW аннотации и OptimisticLockException, их добавил я после того как начали случатся эксепшены на тему OptimisticLock. если конкурирующий процесс уже дернул scheduleExecutionForTable(), моему процессу уже можно ничего не делать. так вот, мои добавки проблему не решили, я вижу в логе надпись "OptimisticLockException catched for pid ", но spring batch транзакция так и откатывается. я понял почему REQUIRES_NEW аннотация не отрабатывает (метод из того же класса вызывается, вынес метод в отдельный класс), но вот почему catch(OptimisticLockException e) не помог не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 09:05 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
hck2 но вот почему catch(OptimisticLockException e) не помог не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 09:09 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов hck2 но вот почему catch(OptimisticLockException e) не помог не понимаю. над scheduleExecutionForTable не шлепнут, но есть над всем AgreementDao, который в конце концов scheduleExecutionForTable() дергает. получается AgreementDao присоединят свою транзакцию к контексту спринг батч транзакции, фейлится, помечает транзакцию на роллбэк и только потом я ловлю exception в forceTableUpdate() ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 09:29 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
hck2, да, все так. Если убрать @Transactional над DAO, то должно заработать без отката транзакций. Правда по хорошему, строго говоря - Hibernate говорит что при любом его исключении сессию нужно очищать, она становится не пригодной. Сам я не знаю когда это может вылезти боком.. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 10:31 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
hck2 над scheduleExecutionForTable не шлепнут, но есть над всем AgreementDao, который в конце концов scheduleExecutionForTable() дергает. получается AgreementDao присоединят свою транзакцию к контексту спринг батч транзакции, фейлится, помечает транзакцию на роллбэк и только потом я ловлю exception в forceTableUpdate() ? у спринга для @Transactional конвенция такая, что в случае исключений во "вложенных" (тут специально в кавычках, потому что оно обычно под "nested" для транзакций нечто иное подразумевается) транзакциях, оно при checked exceptions не фейлит транзакцию, а при RuntimeException фейлит, там есть Transactional#noRollbackFor но из опыта могу сказать что оно совершенно бесполезное, например для вашего OptimisticLockException ситуация на самом деле следующая: - был вызван flush - flush не прошел - то что после этого хранится в контексте хибера вообще непонятно и как это компенсировать тоже непонятно, т.е. если бы OptimisticLockException вам транзакцию не фейлил, то вы бы все равно commit бы не смогли выполнить - оно бы столкнулось на том же месте ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 12:42 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
незачем над верхнеуровневыми слоями транзакции клепать вот и все,они должны быть точечными,если не получатеся - значит сломана архтектура недавно такое разгребал - на всех контроллерах на всех сервисах бездумно вывешены транзакции в итоге обычный каунт вызывал ошибку персистенс контекста при попытке передать id в метод справедливая ошибка дедач сучность пассед ту персист( там еще речь конечно была о каскадных операциях,которые у нас по дефолту все любят вставлять как ALL) просто программисты в общей своей массе вообще не понимаю что такое @Transactional в большинстве люди думают что это транзакция в бдшку и отсюда ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 18:46 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
localhost8080незачем над верхнеуровневыми слоями транзакции клепать вот и все,они должны быть точечными,если не получатеся - значит сломана архтектураЭто как раз и есть основной use case для @Transactional - его и нужно ставить над верхнеуровневыми слоями (Service Facade) а не над низкоуровневыми (Repository). Ибо чаще всего 1 бизнес транзакция (т.е. вызов сервиса) = 1 БД транзакция. localhost8080 просто программисты в общей своей массе вообще не понимаю что такое @Transactional в большинстве люди думают что это транзакция в бдшку и отсюда ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 19:26 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Это как раз и есть основной use case для @Transactional - его и нужно ставить над верхнеуровневыми слоями (Service Facade) а не над низкоуровневыми (Repository). Ибо чаще всего 1 бизнес . Это как раз и не есть этот функционал ,ты бы почитал книги и хотя бы немного разобрался что такое @Transational только идиоты ,которые вообще не понимают что происходит ставят его на верхнем уровне - в итоге получая тормоза изза копий персистенс сучностей и дерти чекинга. Я вангую ты даже понятия не имееш что можно делать по другому ,вы спецы однодневки - ставите @Transactional везде где его еще нет и потом удивляетесь что ваше приложение падает на тыще юзеров) стасян могу тебе дать совет что почитать - покамест ты профан в теме JPA ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 22:09 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Мм.. ну этот механизм и создает "транзакцию в бдшку" :) Ну и если на этот момент не создана ORM сессия, то еще и ее создает. а ты знаешь как конткрентно это происходит от А до Я и что будет если у тебя на верхнем уровне стоит эта анотация? этот механизм не создает никаких транзакций в бдшку ,он вообще ни как не связан с БД может быть ты что то слышал про unit work - загугли что это - может придет осознание того что такое @Transactional пс.печаль вот такие спецы у нас скорей всего сеньеры где то трудятся) ты же сеньер стасян?) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 22:14 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
localhost8080 скорей всего сеньеры где то трудятся) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 22:21 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
PetroNotC Sharp localhost8080 скорей всего сеньеры где то трудятся) ну почитай что он пишет- типо этот механизм создает транзакцию в бд) ок а если нет анотации @Transactional то со слов стасяна и транзакция не создаться в бд)) мало того стасян плохо учил уроки по бд и не знает того,что явно или неявно любой запрос выполняется в рамках транзакции ) пс. реально жалко тех ребят,у кого стасян работает и скорей всего еще ему и деньги за это платят) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 22:31 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
localhost8080 ну почитай что он пишет- типо этот механизм создает транзакцию в бд) ок а если нет анотации @Transactional то со слов стасяна и транзакция не создаться в бд)) мало того стасян плохо учил уроки по бд и не знает того,что явно или неявно любой запрос выполняется в рамках транзакции ) пс. реально жалко тех ребят,у кого стасян работает и скорей всего еще ему и деньги за это платят) Чет вы оба неправы: я же тебе показывал вот тут: 22349359 , что транзакции нужно лепить над бизнес-кодом, а над репозиторями и DAO тоже нужно, но особого смысла не имеет. Что касается самих "транзакций в БД": в JDBC (java.sql) нет нигде явного вызова который бы создавал/начинал транзакцию (сюрприз), есть только вызов фиксации или отката, например для хибера "начало транзакции" - это захват соединения из пула и выключение автокоммита, хотя если его хорошо попросить, то он этого делать не будет, а будет надеяться, что автокоммит и так выключен. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 04:34 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Чет вы оба неправы: я же тебе показывал вот тут: 22349359 , что транзакции нужно лепить над бизнес-кодом, а над репозиторями и DAO тоже нужно, но особого смысла не имеет localhost8080 похоже недавно узнал что @Transactional может управлять ORM сессией и всем хвастается :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 10:31 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 11:04 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Stanislav Bashkyrtsev Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет. именно про бизнес код и речь,но гугломисты ( я так называют прогреров уровня стас) клепают @Transactional на методе,в котором происходит вызов еще 100 методов,99 из которых вообще не интересен перстистенс контекст,получается 99% ресурсов тратиться в пустоту( это и хранение копий сучностией и дерти чекинг) пока не отработают все вложенные методы - контекст не вытолкнется именно поэтому нужно думать куда втыкать эти анотации ,а не как любит стас прям над классом контроллера) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 11:25 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Stanislav Bashkyrtsev Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет. localhost8080@Transactional на методе,в котором происходит вызов еще 100 методов,99 из которых вообще не интересен перстистенс контекст,получается 99% ресурсов тратиться в пустоту( это и хранение копий сучностией и дерти чекинг) пока не отработают все вложенные методы - контекст не вытолкнетсяСтолько заблуждений в одном предложении.. И я бы рассказал в чем они, да устал уже в пустоту говорить. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 14:08 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Столько заблуждений в одном предложении.. И я бы рассказал в чем они, да устал уже в пустоту говорить. ну куда уж нам до стасика гугломиста,который думал что @Transactional тразакцию в бд открывает. Стасян тебе близко к чему то серьезному подпускать нельзя ,иначе получится как сберспасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 18:08 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Stanislav Bashkyrtsev Дак нужно лепить или особо смысла не имеет? Правильней сказать их можно лепить, но особо смысла не имеет. Стас прав по одной простой причине. Если вы используете @Transactional только на слое DAO, а на слое сервисов не используете, и если в одном методе сервиса вызывается несколько разных методов DAO, то каждый из них будет выполняться в отдельной транзакции. При этом нет гарантии что успешно все выполнятся. Т. е. есть риск сломать консистентность данных в БД. Удалив аннотации с сервисных методов мембер localhost8080 похоже сломал логику программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 00:28 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Мне кажется наоборот - пока есть Стас их нужно запрещать на уровне DAO. Потому как если кто-то забудет проставить @Transactional выше по стеку, то мы получим понятное исключение. Если же разрешать проставлять на DAO, то случайно можем забыть проставить над сервисом - и втихую получим N транзакций вместо одной. А такие баги сложно исследовать. Кмк здесь палка о двух концах: - в целом понятно, что дергать DAO без наличия активной транзакции (а я выше упоминал, что в принципе поднять транзакцию ничего не стоит по ресурсам, кроме того что оно будет соединение держать дольше положенного) особо смысла не имеет: даже если мы что-то успешно понавыбирали, то далеко не факт, что мы сможем дернуть свойства (транзакции-то уже нет), ну а при сохранении выбранного оно будет или падать или уходить в тормознутый merge - если @Transactional в DAO не лепить вообще, то "клиент" получит возможность перехватывать исключения и не откатывать транзакцию (прямо как у ТС), ничем хорошим это не светит, более того, мы таким образом вытаскиваем кишки нашего DAO на "клиента", здесь было бы хорошо, если бы была полноценная поддержка NESTED, но увы... получается что не лепить вообще так себе идея, лучше лепить MANDATORY - если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаев ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 03:52 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Roman Osipov Стас прав ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 04:47 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Roman Osipov Стас прав )) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 08:59 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Stanislav Bashkyrtsev Мне кажется наоборот - пока есть Стас их нужно запрещать на уровне DAO. Потому как если кто-то забудет проставить @Transactional выше по стеку, то мы получим понятное исключение. Если же разрешать проставлять на DAO, то случайно можем забыть проставить над сервисом - и втихую получим N транзакций вместо одной. А такие баги сложно исследовать. Кмк здесь палка о двух концах: - в целом понятно, что дергать DAO без наличия активной транзакции (а я выше упоминал, что в принципе поднять транзакцию ничего не стоит по ресурсам, кроме того что оно будет соединение держать дольше положенного) особо смысла не имеет: даже если мы что-то успешно понавыбирали, то далеко не факт, что мы сможем дернуть свойства (транзакции-то уже нет), ну а при сохранении выбранного оно будет или падать или уходить в тормознутый merge Андрей Панфилов- если @Transactional в DAO не лепить вообще, то "клиент" получит возможность перехватывать исключения и не откатывать транзакцию (прямо как у ТС)Эт да.. Хотя как ты выше писал если кто-то отловит исключение внутри @Transactional и продолжит работу с сессией, то снова отхватит тот же optimistic exception. Так что как будто бы не супер страшно, но согласен что баги возможны в таком раскладе. Андрей Панфиловболее того, мы таким образом вытаскиваем кишки нашего DAO на "клиента"Про кишки не понял. Андрей Панфилов- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаевНу а иначе управление транзакциями становится каким-то очень скрытным и неявным процессом - не каждый разработчик поймет что с ними происходит. И у меня возникала бы постоянно паранойя - это специально сделали или просто забыли про транзакции. А утиль - очень простое и явное решение в таких случаях. Андрей Панфилов Roman Osipov Стас прав ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 10:50 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Андрей Панфилов- если @Transactional в DAO не лепить вообще, то "клиент" получит возможность перехватывать исключения и не откатывать транзакцию (прямо как у ТС) Андрей Панфиловболее того, мы таким образом вытаскиваем кишки нашего DAO на "клиента"Про кишки не понял. Ну вот лично я знаю каким образом спринг забороть чтобы транзакции не фейлились, при этом еще могу найти способ компенсировать OptimisticLockException - там не то что бы сложно, но вот DAO - это абстракция, естественно она будет забарываться (причем успешно) за счет знаний конкретной реализации - вот и получилось что верхний слой знает про работу нижнего, что в свою очередь означает что абстракция у нас с дырками (ну просто представьте себе что DAO делает один отдел/компания, а бизнес-логику - другой) Stanislav Bashkyrtsev Андрей Панфилов- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаев У вас ожидания слишком уж тенденциозные, действительность она совсем другая: - о том что @Transactional работает только через прокси знают только те, кто с этим сталкивался (чинил баги или тыкнули носом на ревью), разработчик средней руки о таком поведении ни сном ни духом, т.е. предоставляемое API уже само по себе так себе - API действительно работает через *опу - вот у меня есть вполне себе законные основания полагать, что там где я начал транзакцию, там я и должен принимать решение о фиксации или откате, однако, текущее API исходит из того, что ничерта непонятно, поэтому давайте будем защищаться от "говнокода" И вот дальше вы пытаетесь размазать ответственность за кривой API между всеми (давайте в DAO не лепить @Transactional), а мое мнение заключается в том, что пусть хотя бы один слой работает правильно, а тот, кто делает неправильно, пусть с этим и разбирается. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 11:24 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов Stanislav Bashkyrtsev пропущено... Ну а иначе управление транзакциями становится каким-то очень скрытным и неявным процессом - не каждый разработчик поймет что с ними происходит. И у меня возникала бы постоянно паранойя - это специально сделали или просто забыли про транзакции. А утиль - очень простое и явное решение в таких случаях.) У вас ожидания слишком уж тенденциозные, действительность она совсем другая: - о том что @Transactional работает только через прокси знают только те, кто с этим сталкивался (чинил баги или тыкнули носом на ревью), разработчик средней руки о таком поведении ни сном ни духом, т.е. предоставляемое API уже само по себе так себеНу в своих проектах это один из обязательных ликбезов которые я провожу с каждым разработчиком. Это слишком важно чтоб не знать. Но доходит не до всех сразу. Точнее почти до всех не сразу. Но в итоге все обязаны знать как работают прокси. А пока не знают - ну на ревью найдем. У меня по этому пунктик - я всегда обращаю на это внимание. Но допустим мы работаем по сценарию "разработчики об этом не знают, поэтому не ставим @Transactional над сервисом" - что мы этим достигаем? Еще больше вероятность багов, еще более сложное управление транзакциями, еще больше непониманий о том как это все работает. Это ведь более сложная и неявная схема. Андрей ПанфиловИ вот дальше вы пытаетесь размазать ответственность за кривой API между всеми (давайте в DAO не лепить @Transactional), а мое мнение заключается в том, что пусть хотя бы один слой работает правильно, а тот, кто делает неправильно, пусть с этим и разбирается.@Transactional это не часть DAO слоя. То что мы где-то ожидаем что у нас всего один вызов DAO и поэтому мы не ставим @Transactional над сервисом - это неправильное определение обязанностей DAO. DAO не имеет права определять границы транзакции, это не часть DAO абстракции. Как в общем-то и обработка оптимистических блокировок - это часть бизнес логики. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 11:49 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов ну просто представьте себе что DAO делает один отдел/компания, а бизнес-логику - другой) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 12:13 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Насчет обработки исключений. Обычная практика: - определяются кастомные исключения; - слой DAO может отдавать только эти кастомные исключения; - слой сервисов (бизнес логики) понимает и обрабатывает эти кастомные исключения. Таким образом, кастомные исключения и объекты DTO определяют контракт взаимодействия слоя DAO со слоем сервисов. При замене слоя DAO достаточно, чтобы новый DAO удовлетворял этому контракту. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 14:27 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Roman Osipov, Нарушение FK это кастомные? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 18:30 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Но допустим мы работаем по сценарию "разработчики об этом не знают, поэтому не ставим @Transactional над сервисом" - что мы этим достигаем? Еще больше вероятность багов, еще более сложное управление транзакциями, еще больше непониманий о том как это все работает. Это ведь более сложная и неявная схема. Андрей ПанфиловИ вот дальше вы пытаетесь размазать ответственность за кривой API между всеми (давайте в DAO не лепить @Transactional), а мое мнение заключается в том, что пусть хотя бы один слой работает правильно, а тот, кто делает неправильно, пусть с этим и разбирается. Вы пытаетесь рассказать довольно странную историю на мой взгляд. Из вашего рассказа следует примерно следующее: - вот есть некий слой который в итоге производит манипуляции в БД (тут на самом деле уже странно, поскольку чтобы заставить хибер что-то сделать в БД до вызова flush нужно очень сильно постараться, а если мы вызываем flush явно, то это на самом деле так себе затея, к тому же это касается исключительно ваших проектов, а не вообще всех подряд, я, к примеру, принимал участие в проекте где вызывать flush() считалось западно) - вы смотрите в код хибера (точнее спринга) и наблюдаете, что при определенном стечении обстоятельств в вашем проекте оно выкинет более-менее понятное исключение, причем нужно подчеркнуть что именно в вашем проекте и на вполне определенных версиях (здесь как в соседнем топике: 22385060 , chpasha считает что нужно следоать жавадоку, а вы его игнорируете), откуда принимаете решение что нужно делать именно так как вы увидели и несете это знание в массы, здесь есть кое-какие проблемы: -- если DAO - это самостоятельный слой, то никаких предположений относительно того, как его будут вызывать он делать не должен, т.е. вариантов развития событий в нем всего два: принять данность как есть (т.е. использовать @Trsnsactional), либо отвергнуть (@Transactional(MANDATORY)), у него, как самостоятельного слоя, есть вполне определенная задача: всегда работать корректно -- оба упомянутых варианта всегда работают правильно вне зависимости от того что вы там себе придумали, отличаются они только тем, насколько мы уважаем "клиента" - еще раз повторюсь: заставлять "клиента" приседать с транзакциями на ровном месте - это путь вникуда - если у вас разработчики не понимают где начинаются бизнес-транзакции, а где заканчиваются, то это проблема исключительно разработчиков и их руководства ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 04:15 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Нарушение FK это кастомные? чет у меня есть подозрение, что если по уму делать, то "кастомных" исключений получится где-то полста (которые, к слову сказать, уже в JPA присутствуют), если не добрая сотня, но если скроить, то можно сделать исключение "хрен его знает что тут вообще произошло" и обойтись только им ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 04:21 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов , как-то очень абстрактно написано, я перестаю понимать что мы обсуждаем. Какие-то непонятные предположения про меня, про команду и про руководство.. Не понимаю откуда они взялись и на чем основываются. Я наверно зря писал что отвергаю @Transactional на DAO - я имел в виду именно умолчания, т.е. @Transactional(REQUIRED). А вот @Transactional(MANDATORY) как раз и выливается в то что DAO не определяет границы транзакций - это делают выше по стеку. Это меня устраивает. Так что складывается впечатление что мы говорим об одном и том же. Только для меня ставить @Transactional(MANDATORY) и не ставить @Transactional на DAO вообще с практической точки зрения - одно и то же. Потому как мы в любом случае получаем исключение. А ты, насколько я понимаю, подходишь к этому более строго и требуешь проставлять @Transactional(MANDATORY) чтоб получить более понятное исключение. Я даже начинаю склоняться к тому чтобы тоже начать проставлять MANDATORY. Получается, что таким образом я буду документировать для других что сделал явный выбор не управлять транзакциями на этом уровне. Меня только лишние прокси в стеке раздражают.. Хотя меня продолжает смущает вот эта формулировка: Андрей Панфилов- если мы заставляем "клиента" явно объявлять транзакцию, то это начинает довольно сильно влиять на структуру его кода: нужно или часть методов в public выносить (+ еще появляются приседания с проксями) либо какой-то непонятный утиль внедрять - на мой взгляд это слишком много мороки для большинства случаевТут ты как будто говоришь что клиент не должен управлять транзакциями. Но MANDATORY именно к этому и приводит. Что хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 05:38 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов PetroNotC Sharp Нарушение FK это кастомные? чет у меня есть подозрение, что если по уму делать, то "кастомных" исключений получится где-то полста (которые, к слову сказать, уже в JPA присутствуют), если не добрая сотня, но если скроить, то можно сделать исключение "хрен его знает что тут вообще произошло" и обойтись только им Я вот вообще не вижу кастомных. Например у оракле есть 30 исключений. Как пример выше - нарушение FK при вставке. Эти 30 это же НЕ кастомные. Так в старой парадигме они просто пробрасываются наверх через DAO или через репозиторий. Наверх туда где БЛ. Думаю что спринг бут парадигме тоже самое. Это будет логично. А вот в слое БЛ можно и кастомные родить хоть 500 штук ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 08:00 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Андрей Панфилов , как-то очень абстрактно написано, я перестаю понимать что мы обсуждаем. Какие-то непонятные предположения про меня, про команду и про руководство.. Не понимаю откуда они взялись и на чем основываются. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 09:10 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Roman Osipov Насчет обработки исключений. Обычная практика: - определяются кастомные исключения; - слой DAO может отдавать только эти кастомные исключения; - слой сервисов (бизнес логики) понимает и обрабатывает эти кастомные исключения. Таким образом, кастомные исключения и объекты DTO определяют контракт взаимодействия слоя DAO со слоем сервисов. При замене слоя DAO достаточно, чтобы новый DAO удовлетворял этому контракту. это тоже не всегда работает - потому что например спринг перехватывает ваши исключения и если вы делаете norollBakcFOr =myExeption.class вас ждет сюрприз в некторых случаях ,так как кастомный эксепшен перехватит спринг и в это время вы тут же получите UnexpectedRollbackException и как следвствие откат транзакции ,хотя по логике ожидаете что отката не будет вообще я лично думаю что флоу,которое строится на эксепшенах это признак плохой архитектуры ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 09:15 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
localhost8080 Roman Osipov Насчет обработки исключений. Обычная практика: - определяются кастомные исключения; - слой DAO может отдавать только эти кастомные исключения; - слой сервисов (бизнес логики) понимает и обрабатывает эти кастомные исключения. Таким образом, кастомные исключения и объекты DTO определяют контракт взаимодействия слоя DAO со слоем сервисов. При замене слоя DAO достаточно, чтобы новый DAO удовлетворял этому контракту. это тоже не всегда работает - потому что например спринг перехватывает ваши исключения и если вы делаете norollBakcFOr =myExeption.class вас ждет сюрприз в некторых случаях ,так как кастомный эксепшен перехватит спринг и в это время вы тут же получите UnexpectedRollbackException и как следвствие откат транзакции ,хотя по логике ожидаете что отката не будет вообще я лично думаю что флоу,которое строится на эксепшенах это признак плохой архитектуры Вот что java животворящая делает)) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 09:42 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов, -- если DAO - это самостоятельный слой, то никаких предположений относительно того, как его будут вызывать он делать не должен, т.е. вариантов развития событий в нем всего два: принять данность как есть (т.е. использовать @Trsnsactional), либо отвергнуть (@Transactional(MANDATORY)), у него, как самостоятельного слоя, есть вполне определенная задача: всегда работать корректно Вот здесь ошибка в рассуждениях. Не может и не должен слой DAO всегда работать корректно. Поэтому обрабатывать некорректную работу слоя DAO должен клиент. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 09:55 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Roman Osipov, Ты видел его как самостоятельный слой? Кому он нужен? Это просто сущности с геттерами ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 10:48 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
PetroNotC Sharp localhost8080 пропущено... это тоже не всегда работает - потому что например спринг перехватывает ваши исключения и если вы делаете norollBakcFOr =myExeption.class вас ждет сюрприз в некторых случаях ,так как кастомный эксепшен перехватит спринг и в это время вы тут же получите UnexpectedRollbackException и как следвствие откат транзакции ,хотя по логике ожидаете что отката не будет вообще я лично думаю что флоу,которое строится на эксепшенах это признак плохой архитектуры Вот что java животворящая делает)) Те кто хоть что-то умеет - пишет посты по сути топика, те кто не умеет - бла-бла-бла посты. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 11:15 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Roman Osipov, А ты че влез в наш с ним разговор? Тебе выше вопрос технический про то как ты писал самодостаточный DAO. Борешься за место?)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 11:26 |
|
откатывается транзакция пойманая на OptimisticLockException
|
|||
---|---|---|---|
#18+
Андрей Панфилов А как иначе писать, если DAO - это абстракция. Если у меня в DAO не хибернейт закрытый спрингом, а что-то другое, что наличие активной транзакции не проверяет, мне нужно в DAO лепить @Transactional или нет? А если у меня в методах DAO несколько взаимодействий с БД, мне нужно лепить @Transactional или нет? А если дело касается только вашего определенного кейса, тогда почему вы несете в массу "знания" что в DAO лепить @Transactional не нужно? 1. Ставить @Transactional(MANDATORY) 2. Не ставить @Transactional 3. Ставить @Transactional(REQUIRES) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 16:48 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120325]: |
0ms |
get settings: |
25ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
689ms |
get tp. blocked users: |
2ms |
others: | 361ms |
total: | 1162ms |
0 / 0 |