|
откатывается транзакция пойманая на 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 |
|
|
start [/forum/topic.php?fid=59&msg=40104957&tid=2120325]: |
0ms |
get settings: |
4ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
32ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
492ms |
get tp. blocked users: |
0ms |
others: | 350ms |
total: | 890ms |
0 / 0 |