powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate разрешение конфликтных ситуаций?
25 сообщений из 108, страница 3 из 5
Hibernate разрешение конфликтных ситуаций?
    #39174589
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczlor2а такой вопрос. ексепшн при оптимистической блокировке через вершн будет выкидываться из транзакции или из метода, который применяет изменения внутри транзакции? я к чему спрашиваю - где его ловить и как обрабатывать )
В идеале у вас есть 2 класса
1) Класс Domain Model отвечающий за бизнес-логику. Возможно Service. Так, вот валидация количества, перехват OptimisticLockException и его обработка это бизнес-логика.
2) Класс Repository (иногда DAO) отвечающий за доступ к ORM. Это тот самый класс, который делает UPDATE сущности и выкидывает OptimisticLockException.

В идеале, конечно, надо смотреть где коммит в базу происходит. Либо на session.flush(), либо на session.commit(), либо на выходе из @Transactional метода.

сейчас у меня в приложении три слоя - дао, сервис, контроллеры. @Transactional естественно на уровне сервиса. я не понимаю ОЛЕ выкинет меня сразу же из метода с меткой @Transactional или... где??
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174591
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lor2,

в смысле ексепшн залетит в контроллер? при такой схеме? или мне надо промежуточный слой между сервисом и контроллером создавать?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174594
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2сейчас у меня в приложении три слоя - дао, сервис, контроллеры. @Transactional естественно на уровне сервиса. я не понимаю ОЛЕ выкинет меня сразу же из метода с меткой @Transactional или... где??
Можно явно вызвать коммит у сессии и там ловить исключение.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174633
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczlor2сейчас у меня в приложении три слоя - дао, сервис, контроллеры. @Transactional естественно на уровне сервиса. я не понимаю ОЛЕ выкинет меня сразу же из метода с меткой @Transactional или... где??
Можно явно вызвать коммит у сессии и там ловить исключение.
т.е. я в дао создаю еще один метод типа "коммит_транзакшн" вызываю его в сервисном слое и там же окружаю трайкечем? по-моему вообще макарон-пакарон получается. не?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174638
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно решить и по другому - начал выбирать - тебе всплыла подсказка - этот товар зарезервирован тем-то, в таком количестве
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174643
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяможно решить и по другому - начал выбирать - тебе всплыла подсказка - этот товар зарезервирован тем-то, в таком количестве

Как вариант в сервисе сделать два метода. Один содержащий логику БД, ну то есть ваш первоначальный вариант, обернуть его в Transactional, а второй метод это вызов первого и обработка OptimistickLocking
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174644
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не то процитировал сорри
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174649
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2т.е. я в дао создаю еще один метод типа "коммит_транзакшн" вызываю его в сервисном слое и там же окружаю трайкечем? по-моему вообще макарон-пакарон получается. не?
Ну, не же. У тебя в сервисе:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Record tomates = dao.readTomates();
if(tomates.available >= tomatesNeeded){
       try{
            tomates.available -= tomatesNeeded;
            dao.update(tomates);
       } catch(OptimisticLockException ole) {
            //log & repeat
       }
}


А в DAO
Код: java
1.
2.
3.
  
session.update(record);
session.flush();
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174658
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА в DAO
Код: java
1.
2.
3.
  
session.update(record);
session.flush();



А если update вызывается из нескольких мест?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174665
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никlor2,
вам надо почитать про уровни изоляции транзакций. Вам скорее всего подойдет READ_COMMITTED

SERIALIZABLE.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174677
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ох. а оказывается @Version нельзя поставить на стринг!
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174678
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никА если update вызывается из нескольких мест?
Так DAO не нужен.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174679
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2ох. а оказывается @Version нельзя поставить на стринг!
Вы реально даже не пытаетесь понять что этот version делает и как работает optimistic lock?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174709
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну я понял так - ставим в какое-то поле аннотацию вершн и теперь у нас получается что в случае коммита каких то изменений этого объекта одна из транзакций будет выкидывать ексепшн. не?? сейчас сижу бьюсь.

автор public void testCall(){
Employee employee = (Employee) sessionFactory.getCurrentSession().get(Employee.class, 2);
employee.setName(new Date().toString());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
employee.setName(new Date().toString());

sessionFactory.getCurrentSession().update(employee);


}
запускаю это вот внутри транзакции через секунду два раза. (две транзакции) никаких ексепшенов не вываливается.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174712
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2ну я понял так - ставим в какое-то поле аннотацию вершн и теперь у нас получается что в случае коммита каких то изменений этого объекта одна из транзакций будет выкидывать ексепшн. не?? сейчас сижу бьюсь.


Нет, это специально поле должно быть, не ленитесь почитайте про эту аннотацию
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174746
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

блин. просто забыл аннотацию саму поставить, совсем мозги заклинило :) спасибо всё работает сроу выкидывается. НО.


делал по этому варианту 1 к 1:

Blazkowiczlor2т.е. я в дао создаю еще один метод типа "коммит_транзакшн" вызываю его в сервисном слое и там же окружаю трайкечем? по-моему вообще макарон-пакарон получается. не?
Ну, не же. У тебя в сервисе:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
Record tomates = dao.readTomates();
if(tomates.available >= tomatesNeeded){
       try{
            tomates.available -= tomatesNeeded;
            dao.update(tomates);
       } catch(OptimisticLockException ole) {
            //log & repeat
       }
}


А в DAO
Код: java
1.
2.
3.
  
session.update(record);
session.flush();



один фиг выкидывает ексепшн в контроллер. причем вначале он в дао ловится, потом не ловится в сервисе вообще никак. даже ексепшн чистый. и улетает в контроллер (там ловится). бред какой то. хотя может так и правильно. словили в контроллере и там же решили репит или показать клиенту что-нибудь ругательное.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174787
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот интересно с оптимистиком залупил чтоб пробовал с рандомной задержкой заново и заново сохранить. так и не дождался когда с десяток запросов отработается. потом сделал с пессимистиком. причем пессимистик локать не давал когда залочено. алгоритм анлогичный - пробуем залочить если не вышло ждем рандомное время и еще раз пробуем (всего 10 попыток) -- отстрелялись все транзакции.

блин. ява это что то с чем то :) я ее люблю :)
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39175565
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSERIALIZABLE.Пристрелил бы ...
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39177213
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
копаю дальше... такая тема когда пессимистически ставлю лок, то у меня последующие транзакции выкидывают сразу же ексепшн :) а я думал они просто висеть будут и ждать своей очереди. а они не ждут. или я что то не так делаю? как сделать очередь? иначе я разницы с @Version не вижу кроме разве что типа выбрасываемого ексепшна. причем оба кидаются в контроллер.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39177214
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2копаю дальше... такая тема когда пессимистически ставлю лок, то у меня последующие транзакции выкидывают сразу же ексепшн :) а я думал они просто висеть будут и ждать своей очереди. а они не ждут. или я что то не так делаю? как сделать очередь? иначе я разницы с @Version не вижу кроме разве что типа выбрасываемого ексепшна. причем оба кидаются в контроллер.

Какой ексепшн?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39177234
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

в каком случае? в случае аннотации вершн там что то вроде ОЛЕ вылетает но не ОЛЕ, в случае пессимистика - другая. могу завтра уточнить. но точно они разные.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39193496
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

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

Код: sql
1.
2.
3.
4.
18:11:47.830 [http-nio-8080-exec-7] WARN  o.h.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 50200, SQLState: HYT00
18:11:47.831 [http-nio-8080-exec-7] ERROR o.h.engine.jdbc.spi.SqlExceptionHelper - Время ожидания блокировки таблицы  истекло
Timeout trying to lock table ; SQL statement:
/* PESSIMISTIC_READ lock com.springapp.mvc.entity.Employee */ select emloyee_id from EMPLOYEE where emloyee_id =? for update [50200-186]



т.е. я так понимаю транзакции выстраиваются в очередь, и те что успели отработать - отработали, а те что нет - тупо ексепшн:

я так понимаю надо либо где то этот таймаут увеличивать, (хз где? это хиберская штучка или бдшная уже?) либо ловить ексепшн и долбить пока не додолбится.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39193517
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2я так понимаю надо либо где то этот таймаут увеличивать
, (хз где? это хиберская штучка или бдшная уже?) либо ловить ексепшн и долбить пока не додолбится.
Может просто сказать транзакции Serializable и пусть сервер их в очередь выстраивает сам?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39193531
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

изьвиняюсь, как это в хибере делается -
вариант
Код: java
1.
 @Transactional(isolation = Isolation.SERIALIZABLE)



чот ругается. да и в таком случае я логики работы не понимаю если у меня пару транзакций сериалайзбл, а остальные нет? )) откуда он узнает что и как раскладывать. нет, у меня нет вопросов если я всю базу просто помечаю на четвертый (сериалайзбл) уровень изоляции.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39193537
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2,
у тебя логика должна - наложили блок, работаем, соммит (сняли)
Дак вот, когда пошла первая транзакция с select for update, то после райзе надо откатывать все технические транзакции в одной бизнес-транзакции.
А долбится или нет решается на самом верху.
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 3 из 5
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate разрешение конфликтных ситуаций?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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