powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / откатывается транзакция пойманая на OptimisticLockException
25 сообщений из 39, страница 1 из 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
25 сообщений из 39, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / откатывается транзакция пойманая на OptimisticLockException
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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