powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate разрешение конфликтных ситуаций?
108 сообщений из 108, показаны все 5 страниц
Hibernate разрешение конфликтных ситуаций?
    #39174159
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
допустим у меня есть код внутри транзакции:
бронирование помидоров на складе.
1) проверяем остатки помидоров на складе. если надо меньше помидоров чем остатки
то - бронируем и вычитаем из остатков. если больше - то отказ.
---конец---

теперь у меня допустим, на складе 20 помидоров. идет первая транзакция - бронируем 15 помидоров. вторая транзакция - бронируем 10 помидоров.

если они последовательно выполняются у нас получается что проходит первый бронькнул 15 остатки 5 второму - отказ.

если они идут одновременно: допустим, оба сделали проверку, оба получили тру. первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5???

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

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

хорошо, значит получается в конфиге по умолчанию такой вариант произойти может да?

Я точно не помню, врядли READ_UNCOMMITED стоит по дефолту, скорее всего как раз READ_COMMITTED, если вы только сами не переопределили. Отвечая на ваш вопрос - хорошо что вы об этом задумываетесь, но хибер разрулит в вашем случае. в отличие от plain jdbc(правда и там можно выставить Connection autoCommit=false).

Хотя я тут подумал, смотря еще какой у вас код, можете показать sql?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174208
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

если они идут одновременно: допустим, оба сделали проверку, оба получили тру. первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5???

Что значит "тяпнул" ? Если заблокировать, то нет, не будет - т.к. второй не сможет заблокировать уже заблокированное. Будет exception
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174209
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, Hibernate ничего сам не разрулит.
При этом Hibernate это только инструмент, и прежде чем вы его начнете применять, хорошо бы понимать как он работает.
Поэтому для начала нужно понять две вещи
1) Теория заключается в том что надо выбрать между
- Пессимистической блокировкой, которая на уровне БД выглядит как SELECT FOR UPDATE. (Блокировка простая и надежная, но она выстраивает запросы в очередь и под высокой нагрузкой и при большой конкуренции начинаются сложности.) ... и оптимистичной блокировкой, которая достаточно просто реализована в хибере в виде @Version поля. Обе транзакции вычитывают свободные помидоры, обе пытаются их отнять от общего количества, но если это происходит одновременно, то одна из транзакций выхватывает исключения оптимистической блокировки. И уже вам как кодеру нужно решить что вы делаете с этим исключением.
Это решение хорошее, но нужно правильно продумывать обработку исключения.

2) Практика же иногда предлагает на много более простые решения, как например, SQL запрос выборки с одновременной валидацией значения.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174219
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я нашел вот это:
setProperty("hibernate.connection.isolation", "2");

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

чуть ранее я задавал тут похожий вопрос - мне сказали - когда засовываешь всё в одну транзакцию то типа "так не будет" :)
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174228
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2я нашел вот это:
setProperty("hibernate.connection.isolation", "2");

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

чуть ранее я задавал тут похожий вопрос - мне сказали - когда засовываешь всё в одну транзакцию то типа "так не будет" :)

Опять же, смотря что вы подразумеваете под посчитать помидоры и отнять. Как это реализовано?

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

Код: java
1.
2.
3.
4.
int count = select count of tomato
if (count > order.count) {
    update pomidors set count = count - order.count
}



и есть check constraint что поле count не может быть < 0, то достаточно выставить правильный уровень изоляции. При отсутствии констрейнта хибер сам не разгребет, и тд
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174231
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2я нашел вот это:
setProperty("hibernate.connection.isolation", "2");

Это вам не надо.

lor2где уровень указвается. и да, что то читал насчет версионинга но в инете инфы как то маловато. значит люди с этим не сталкиваются.
Все сталкиваются. Вы, возможно, не так искали.


lor2в практике же "посчитать количество помидор и отнять помидоры" это слишком коротакая транзакция и может действительно с этим по этой причине и не сталкиваются.
Кстати, это хорошее дополнение к моему комментарию выше. Для короткой транзакции пессимистичная блокировка позволительна.
Для длинной же "вычитать кол-во доступных помидоров, затем через N минут закомитить измененний" пессимистичная блокировка не подходит вообще.

lor2скулем пользвоаться бы не хотелось по возможности.

Почему?

lor2касательно аннотации @Version тоже не совсем ясно для меня как оно работает. я что ставлю эту аннотацию и проблема решена чтоль?
Нет. У тебя есть запись Помидоры, 20, v1. Её вычитывают 2 клиента. Затем оба пытаются обновить её:
-15 (Помидоры, 5, v2)
-10 (Помидоры, 10, v2)
Первый успевает, второй получает исключение, потому что в базе v2 и у него v2.
v2 это поле помеченое @Version.


lor2чуть ранее я задавал тут похожий вопрос - мне сказали - когда засовываешь всё в одну транзакцию то типа "так не будет" :)
Сложно дать точный ответ на помидорах. Нужно точное описание процесса и транзакции.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174235
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, про уровень изоляции транзакций это я не в ту степь немного, но опять же зависит от кода
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174236
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
Код: java
1.
2.
3.
4.
int count = select count of tomato
if (count > order.count) {
    update pomidors set count = count - order.count
}



Можно даже что-то типа
UPDATE pomidors SET count = count - order.count WHERE count >= order.count.
И потом смотреть количество измененных записей.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174238
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczзабыл ник
Код: java
1.
2.
3.
4.
int count = select count of tomato
if (count > order.count) {
    update pomidors set count = count - order.count
}



Можно даже что-то типа
UPDATE pomidors SET count = count - order.count WHERE count >= order.count.
И потом смотреть количество измененных записей.

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

у помидора связь с резервацией ван ту мени. (если это важно)

процесс выглядит так
1) загружаем в помять объект помидор. проверяем количество помидоров на складе по полю "количество" в объекте помидор, если количество помидоров больше количества в брони то

2а) отнимаем от объекта помидор количество в брони и обновляем объект помидор в базе. следом сохраняем резервацию.
2б) если в брони больше чем остатков то выходим с сообщением что бронь неверна.

собссно всё.


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

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

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

В вашем случае хибер сам не разрулит, даже с аннотацией Version. Вариантов несколько:

1) Если не трогать код, то достаточно добавить check constraint на поле количество помидоров. Тогда при коммите вылетит эксепшен вы словите и покажете юзеру
2) Поменять код, и использовать прямой sql UPDATE pomidors SET count = count - order.count WHERE count >= order.count. Если количество проапдейченых строк = 1 то ок, если 0 - говорите юзеру извини
3) Вначале залочить объект помидор session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato);
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174272
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот. у нас две таблицы итемПати (серия) и резервация (резервация)

автор @Transactional
public void addReservation(Reservation reservation) {
ItemParty itemParty = daoItemParty.getItemPartyById(reservation.getItemParty().getId());
if(itemParty.getAmount()>reservation.getAmount()){

dao.addReservation(reservation);
}else {
...шлем в пень....
}

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

В вашем случае хибер сам не разрулит, даже с аннотацией Version. Вариантов несколько:

1) Если не трогать код, то достаточно добавить check constraint на поле количество помидоров. Тогда при коммите вылетит эксепшен вы словите и покажете юзеру
2) Поменять код, и использовать прямой sql UPDATE pomidors SET count = count - order.count WHERE count >= order.count. Если количество проапдейченых строк = 1 то ок, если 0 - говорите юзеру извини
3) Вначале залочить объект помидор session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato);

выходит в процедуру редактирования сущности итемпати я вставляю вот это?
автор public void editItemParty(ItemParty itemParty) {
// sessionFactory.getCurrentSession().buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(itemParty);??
sessionFactory.getCurrentSession().update(itemParty);

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

автор@Transactional
public void addReservation(Reservation reservation) {
ItemParty itemParty = daoItemParty.getItemPartyById(reservation.getItemParty().getId());
if(itemParty.getAmount()>reservation.getAmount()){
itemParty.setAmount(itemParty.getAmount()-reservation.getAmount());
dao.addReservation(reservation);
}else {
...шлем в пень....
}

}
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174297
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2теперь вопрос - как устанавливать тип блокировки в хибере на отдельные транзакции? :)
Не понял вопроса. Добавляешь поле и @Version на него и получаешь результат. Какие ещё "отдельные транзакции"?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174299
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никВ вашем случае хибер сам не разрулит, даже с аннотацией Version.
Почему нет?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174302
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczзабыл никВ вашем случае хибер сам не разрулит, даже с аннотацией Version.
Почему нет?

Потому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174333
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никПотому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще
Ну, да. Всё зависит от системы и требований.
Имеет ли смысл показать сообщение пользователю "ой а помидоров уже 20, а не 30", если он хотел резервировать всего 10? Где-то имеет, а где-то нет. Зависит от требований.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174337
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2может быть, но блин. неужель без скуля никак не получится обойтись? :) я ведь даже выборки по критериям стараюсь делать. чтоб скуэля по минимуму.
На HQL/JPQL можно запрос написать. Стремиться к критериям ради критериев? Зачем? HQL проще читается.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174349
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никПотому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще
В крупных системах так обычно не делают.

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

забыл никupdate count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще
Недостаток оптимистичной блокировки.

Писсимистичная просто будет стоять и ждать, пока запись разблокируется. Т.е.

SELECT count FROM inventory_total WHERE item_id = :id FOR UPDATE -- Поставили блокировку
-- Какая-то логика
UPDATE SET count=new_count inventory_total WHERE item_id = :ID
COMMIT

никаких exception не будет
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174353
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

так а я про что? Вы меня наверное с ТС перепутали, вариантов множество, все зависит от системы и требований. Я просто отвечал почему оптимистичная блокировка здесь не самый лучший вариант
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174357
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczзабыл никПотому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще
Ну, да. Всё зависит от системы и требований.
Имеет ли смысл показать сообщение пользователю "ой а помидоров уже 20, а не 30", если он хотел резервировать всего 10? Где-то имеет, а где-то нет. Зависит от требований.
в моем случае достаточно отнять и забыть. вот если не хватает - тогда сруо эксепшн и уже его обработать. показать типа - извините но на складе уже меньше.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174364
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2Blazkowiczпропущено...

Ну, да. Всё зависит от системы и требований.
Имеет ли смысл показать сообщение пользователю "ой а помидоров уже 20, а не 30", если он хотел резервировать всего 10? Где-то имеет, а где-то нет. Зависит от требований.
в моем случае достаточно отнять и забыть. вот если не хватает - тогда сруо эксепшн и уже его обработать. показать типа - извините но на складе уже меньше.

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

но я же могу повторно просто чек сделать и всё. если снова вылетает я снова чек делаю и до тех пор пока либо оно не отнимет и не закоммитит резервацию либо пока меньше нуля не станет и оно не вернется сообщением юзеру.

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

SELECT count FROM inventory_total WHERE item_id = :id FOR UPDATE -- Поставили блокировку
-- Какая-то логика
UPDATE SET count=new_count inventory_total WHERE item_id = :ID
COMMIT

никаких exception не будет

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

но я же могу повторно просто чек сделать и всё. если снова вылетает я снова чек делаю и до тех пор пока либо оно не отнимет и не закоммитит резервацию либо пока меньше нуля не станет и оно не вернется сообщением юзеру.

не знаю правда, как этот подход с точки зрения красоты.

Несомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174389
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2Leonid KudryavtsevПиссимистичная просто будет стоять и ждать, пока запись разблокируется. Т.е.

SELECT count FROM inventory_total WHERE item_id = :id FOR UPDATE -- Поставили блокировку
-- Какая-то логика
UPDATE SET count=new_count inventory_total WHERE item_id = :ID
COMMIT

никаких exception не будет

ох как всё сложно. а в туториалах всё так просто :) выходит, без скуля/хкуля никак?

Абсолютно не сложно, это и есть session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato);
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174397
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никНесомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями
На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java.
Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить.
Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174409
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczзабыл никНесомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями
На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java.
Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить.
Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации.
блин. :) покажите мне плиз пример констрейнта но без примеров он апдейт на скуле.

и еще вопрос:

session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato); это я могу только в дао леере ставить но я в упор не понимаю где именно мне его ставить этот лок, если логика всё-равно у меня идет на сервисном леере.

у меня есть две дао процедуры

дао.добавить_резервацию.
дао.обновить_серию (это айтем помидор)
дао.прочитать_серию_с_айди_таким_то.

суть процесса выглядит так:
в сервисном слое.

дао.прочитать_Серию_с_айди
принять решение если да то
дао.обновить_серию
если нет то всё.

куда иемнно тут вставлять строчку
session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato) ????
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174411
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczзабыл никНесомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями
На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java.
Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить.
Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации.

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

На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java.
Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить.
Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации.
блин. :) покажите мне плиз пример констрейнта но без примеров он апдейт на скуле.

и еще вопрос:

session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato); это я могу только в дао леере ставить но я в упор не понимаю где именно мне его ставить этот лок, если логика всё-равно у меня идет на сервисном леере.

у меня есть две дао процедуры

дао.добавить_резервацию.
дао.обновить_серию (это айтем помидор)
дао.прочитать_серию_с_айди_таким_то.

суть процесса выглядит так:
в сервисном слое.

дао.прочитать_Серию_с_айди
принять решение если да то
дао.обновить_серию
если нет то всё.

куда иемнно тут вставлять строчку
session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato) ????

Надеюсь вы поняли что session это EntityManager? Так вот, если вы все-таки выберете вариант с пессимистеческойблокировкой, то надо делать так - создать новый метод в дао LockPomidor, в нем прописываете
Код: java
1.
2.
session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato);
return session.find(Tomato.class, id)



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

На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java.
Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить.
Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации.

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

а пессимистическую блокировку в хибере можно делать только так?

авторSELECT count FROM inventory_total WHERE item_id = :id FOR UPDATE -- Поставили блокировку
-- Какая-то логика
UPDATE SET count=new_count inventory_total WHERE item_id = :ID
COMMIT

т.е. я в любом случае должен буду через скуль помечать строку в таблице фор апдейт, перед тем как сравнить значения, а после того как апдейт произошел (или не произошел) я снимаю?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174432
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никПри большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку
С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174433
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2а пессимистическую блокировку в хибере можно делать только так?

авторSELECT count FROM inventory_total WHERE item_id = :id FOR UPDATE -- Поставили блокировку
-- Какая-то логика
UPDATE SET count=new_count inventory_total WHERE item_id = :ID
COMMIT

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

Код: java
1.
2.
3.
4.
5.
public Tomato lockTomato(Long id){
     Tomato t =em.find(Tomato.class, id);
     em.lock(e, LockModeType.PESSIMISTIC_READ);
     return t;
}
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174443
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczзабыл никПри большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку
С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом.
Соглашусь, тогда когда бы вы рекомендовали использовать пессимистик?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174445
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никlor2пропущено...

блин. :) покажите мне плиз пример констрейнта но без примеров он апдейт на скуле.

и еще вопрос:

session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato); это я могу только в дао леере ставить но я в упор не понимаю где именно мне его ставить этот лок, если логика всё-равно у меня идет на сервисном леере.

у меня есть две дао процедуры

дао.добавить_резервацию.
дао.обновить_серию (это айтем помидор)
дао.прочитать_серию_с_айди_таким_то.

суть процесса выглядит так:
в сервисном слое.

дао.прочитать_Серию_с_айди
принять решение если да то
дао.обновить_серию
если нет то всё.

куда иемнно тут вставлять строчку
session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato) ????

Надеюсь вы поняли что session это EntityManager? Так вот, если вы все-таки выберете вариант с пессимистеческойблокировкой, то надо делать так - создать новый метод в дао LockPomidor, в нем прописываете
Код: java
1.
2.
session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_READ)).lock(tomato);
return session.find(Tomato.class, id)



В сервис слое заменяете дао.прочитать_Серию_с_айди на дао.ЛокПомидор все остальное остается без изменений. В конце транзакции блокировка снимется автоматом.

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

Постарайтесь запомнить. Оптимистическая блокировка - аннотация Version. Пессимистическая - em.lock(e, LockModeType.PESSIMISTIC_READ); Как видите sql можно не писать ни там ни там, тут скорее титанические муки выбора какую же все же взять :)
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174453
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczзабыл никПри большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку
С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом.
выходит делаем через вершн и сру? и зацикливаем (ну пусть определенное число циклов а потом всё-равно вываливаемся с сообщением типа "сервер перегружен") так выходит?

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

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

П,С

ALTER TABLE Tomato
CONSTRAINT CHK_TOMATO_NOT_NEGATIVE
CHECK (count >=0);
GO
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174533
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а такой вопрос. ексепшн при оптимистической блокировке через вершн будет выкидываться из транзакции или из метода, который применяет изменения внутри транзакции? я к чему спрашиваю - где его ловить и как обрабатывать )
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174549
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2а такой вопрос. ексепшн при оптимистической блокировке через вершн будет выкидываться из транзакции или из метода, который применяет изменения внутри транзакции? я к чему спрашиваю - где его ловить и как обрабатывать )
В идеале у вас есть 2 класса
1) Класс Domain Model отвечающий за бизнес-логику. Возможно Service. Так, вот валидация количества, перехват OptimisticLockException и его обработка это бизнес-логика.
2) Класс Repository (иногда DAO) отвечающий за доступ к ORM. Это тот самый класс, который делает UPDATE сущности и выкидывает OptimisticLockException.

В идеале, конечно, надо смотреть где коммит в базу происходит. Либо на session.flush(), либо на session.commit(), либо на выходе из @Transactional метода.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174551
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczпропущено...
С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом.

Крайне спорно.

На самом деле, что одно, что другое при частых конфликтах будет становится узким местом. Но если пессимистический блокировка будет тупо стоять и ждать, то оптимистическая будет неудачными ретраями забивать и апп.сервер и базу.

Админ базы или надзирающая софтина пессимистическую блокировку и/или деадлок увидит, а при оптимистической - черт знает что получится на продакшене, просто 100500 бессмысленных ретраев.

Блокировка - нормальная, штатная функция БД. Никаким источником проблем (при отсутвие кривых рук программистов) не становится. И незачем подменять штатные функции БД изобретенным велосипедом в виде "ретраев" IMHO

На кластерах и No-SQL наверное все не совсем так... но я их за полноценные БД не считаю ))).

AFAIK Оптимистическая блокировка больше придумана для GUI. Когда оператор открыл запись на редактирование и полчаса ее держит. Тогда да, оптимистическая блокировка имеет право на жизнь.

IMHO & AFAIK

БЕЗ приминимости к Hibernate.

P.S.
Архитектуру БД нужно нормальную делать. Что бы взаимных блокировок при вычислениях было меньше и деадлоки в БД на каждом шагу не возникали.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39174558
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevто оптимистическая будет неудачными ретраями забивать и апп.сервер и базу.
Неудачные ретраи на много проще убрать.

Leonid KudryavtsevАдмин базы или надзирающая софтина пессимистическую блокировку и/или деадлок увидит
Сначала его увидят юзеры, когда блокировочная RDBMS вдруг решить что больно много у нас тут блокировок, а ну всем транзакциям стой раз-два.

Leonid KudryavtsevБлокировка - нормальная, штатная функция БД. Никаким источником проблем (при отсутвие кривых рук программистов) не становится.
Никто не спорит. Но чем меньше у нас блокировок тем больше у нас шансов выдержать увеличение нагрузки на систему.
А чем больше у нас блокировок, тем больше у нас шансов что система встанет в самый непредвиденный момент

Leonid KudryavtsevИ незачем подменять штатные функции БД изобретенным велосипедом в виде "ретраев" IMHO

Это не велосипед. И как я уже указал выше, если решил повторить транзакцию, то будь уверен, что система не решит повторять её вновь и вновь. Риск от кривой реализации есть в обоих сценариях.

Leonid KudryavtsevAFAIK Оптимистическая блокировка больше придумана для GUI. Когда оператор открыл запись на редактирование и полчаса ее держит. Тогда да, оптимистическая блокировка имеет право на жизнь.

Об этом всём я уже написал выше в теме.

Leonid KudryavtsevАрхитектуру БД нужно нормальную делать. Что бы взаимных блокировок при вычислениях было меньше и деадлоки в БД на каждом шагу не возникали.
Ну, вот если на каждый пук мы будем делать SELECT FOR UPDATE, то никуда от дедлоков потом не спрячешься. А если так уж так повелось что сервер какой-нибудь MySQL, то всё ещё хуже.
...
Рейтинг: 0 / 0
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
Hibernate разрешение конфликтных ситуаций?
    #39193540
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2
Код: java
1.
@Transactional(isolation = Isolation.SERIALIZABLE)


я бы сервер не трогал.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39193552
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2при пессимистической блокировке если у меня запускается мешок транзакций, то несколько исполняются в очереди, а остальные сыпятся с ошибкой:
18835378
Я вам первым же сообщением написал что пессимистик не годится для высоких нагрузок. Сколько у тебя продавцов томатов что они усердно за них конкурируют? Если ты highload пишешь для высокой конкурентности, то тебе блокировки вообще не подходят ни в каком виде.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39193574
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123у тебя логика должна - наложили блок, работаем, соммит (сняли)
lor2,
проверь, где это у тебя происходит?
- в десктопе - сиди в локе хоть целый день.
- в вебе обычно это в сервлете или ещё где, за 0,01 секунды!
imho
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39194075
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczlor2при пессимистической блокировке если у меня запускается мешок транзакций, то несколько исполняются в очереди, а остальные сыпятся с ошибкой:
18835378
Я вам первым же сообщением написал что пессимистик не годится для высоких нагрузок. Сколько у тебя продавцов томатов что они усердно за них конкурируют? Если ты highload пишешь для высокой конкурентности, то тебе блокировки вообще не подходят ни в каком виде.
да это всё ясно конечно же. я о том, чтоб разобраться в нюансах работы. а вообще, у меня товарищ есть скулевец, он вообще лютый проповедник-пессимист. для него опт. принципиально не существует. ну видимо, мнений много разных.

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

ты не путай транзакции хибера, бизнес и технические.
в сервлете у тебя должно так:

ВИ №1 ОРМ + пессимистик + короткие
=====================
за 0,01 сек
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
try {
  System.out.println("хибер читает объект с количеством помидоров");
  Main u = select count ....... for update = второй на этой строке отгребёт райзе
  if u.CountPomidores достаточно
    u.setPomidores(0);
  session.saveOrUpdate(u);
  System.out.println("Сохранили в БД класс без коммита");
} finally {
  HibernateUtil.commitTransaction();
  System.out.println("Коммит прошёл. Всё = блокировка снялась!");
}
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39194275
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5???
технический овердрафт по дебетовой карте))
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39194441
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

ахахаха точно. оно и есть. значит они тоже мучаются с такими проблемами.

Петро, ты извини, я просто не умею думать скулем, я думаю хиберовскими шаблонами :) разумеется, если речь о транзакции то это в рамках хибера. скажу более речь (с моей стороны) идет в рамках методов, помеченных аннтотацией "транзакшионал". идею в общем то понял, просто для меня грань еще более размытой стала между лок на чтение и оптимистик. если я делаю лок на чтение то последующие транзакции типа "в очереди ждут" а потом отваливаются бросая ексепшн, если ждут "долго", в оптимистике у меня тупо сразу же если версия изменилась идет откат транзакции и так же вылетает ексепшн. в обоих случаях надо городить логику как себя вести при ексепшене. либо ждать либо юзера посылать подальше либо еще что-то.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39194480
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2значит они тоже мучаются с такими проблемами
ты про банки?
Они не мучаются). Наоборот переложи на плечи клиентов свои проблемы. Транзакции то - отложенные и распределённые. Иначе ни как.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39194492
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2в обоих случаях надо городить логику
конечно надо.
Например, в десктопе длинная пессимистик:
====================
- в Урюпинске чел СМОТРИТ список товаров (select обычный)
- нажимет на выбранном товаре РЕДАКТИРОВАТЬ = (select update)
(если заснул, то все ругаются кто заблокировал)
- OK = Commit = выход из блока и гарантия что никто в минус не ушёл

Например, в десктопе КОРОТКАЯ пессимистик:
================
- (select update) только в момент изменения значения как выше в сервлете

Оптимистик будет хибером при сохранеии вылетит что НЕ ПОЛУЧИЛОСЬ.
...
Типо так.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39194495
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123lor2первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5???
технический овердрафт по дебетовой карте))
Я с технический "овердрафт по дебетовой карте" сталкивался только тогда, когда КОММИСИЯ банка не помещалась в остаток по счету. Т.е. деньги у меня есть, а вот на КОММИСИЮ банка(ов) не хватило

Дебетовая карточка, которая позволяет лихо "тяпать 15 кг. помидоров и потом без денег еще 10" - не видел.

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

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

кстати, ткой вопрос в контексте спринга и его аопа.

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

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

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate3/HibernateTransactionManager.html

По-умолчанию одна сессия на одну транзакцию. При остром желании это можно изменить, но нужно понимать что делаешь.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195108
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2версионирование - без него по ходу никуда.
Ты не учился в ВУЗе? )))
Первое что делают - списывают и ищут "рыбу".
- найди аналог из сети твоего ВИ \ use case.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195110
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2может произойти лютый треш если не делать хоть какую то блокировку, аж волосы на спине зашевелились. ))
"Компромиссы и проблемы"
http://www.k-press.ru/cs/2009/3/ts/ts.asp
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195111
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123lor2версионирование - без него по ходу никуда.
Ты не учился в ВУЗе? )))
Первое что делают - списывают и ищут "рыбу".
- найди аналог из сети твоего ВИ \ use case.
я учился в вузе 6 лет, но мое направление хоть и связано с техникой, но мало связано с программированием.


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


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

что лучше
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195112
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2типа одна транзакция закидывает бабки а другая их списывает
общее правило - Ты должен страться уйти вообще от блокировок.
Тебя не смущает, что ты просматриваешь тут тему, а она может быть удалена админом в данный момент.
Или мы смотрим на звезду, а она уже миллионы лет не существует)).
...
Сначала помидоры разбери, прежде чем везде версии совать.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195113
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2что лучше
вошёл в сервлет = открыл
вышел из сервлета = закрыл и забыл.
Разве не очевидно?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195114
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2просто есть мнение что открытие и закрытие сессии в хибере отгрызает достаточно много ресурсов

Мнение авторитетное или так себе? Открытие сессии не стоит ничего. Закрытие, естественно, отжирает ресурсы, так как оно связно с обновлением состояния и коммитом транзакции.

lor2 и делая много мелких тразакций ты эти ресурсы будешь под себя подгребать.

Это лирика, которая к технической стороне вопроса никакого отношения не имеет.

lor2 с другой стороны делая мало длинных трнанзакций ты тоже получаешь определенные недостатки.

Короткие транзакции лучше, это в каждом букваре написано. Чем короче транзакции, тем меньше между ними соперничества, тем меньше системе нужно тратить ресурсов на разруливание конкуренции. А на тупых блокировочниках типа MySQL длинные транзакции это смерть системы под нагрузкой.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195116
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz тебе уже сказал. Откуда мелкие транзакции тогда могут у тебя произойти?
При декларативных ставь то, что написано выше статье.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195123
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вошёл в сервлет = открыл
вышел из сервлета = закрыл и забыл.
Разве не очевидно?
Если сервлет это бизнес-транзакция, то да. А если это всего лишь View к бизнес-слою, то, наверное, не надо.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195132
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж. Читаю и волосы встают дыбом.

А еще меня удивляло, как система мировой лидер ( Oracle Customer Care & Billing, SPL WG Customer Care & Billing) умудряется ничего не блокировать и создавать одному клиенту по два одинаковых счета на одну и ту же дату.

Тот же подход... Hibernate, @Version и не е#$т
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195134
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕсли сервлет это бизнес-транзакция, то да. А если это всего лишь View к бизнес-слою, то, наверное, не надо.
да, конечно так.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195141
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вчера набивал ответ в данную тему, потом стер.

Т.к. IMHO вопрос топикастера с Java и Hibernate связан слабо. Концептуально проблема как организована работа с системой и данными. И вопрос скорее относится к форуму ERP.

Т.к. я бы разделял две задачи:

1. Форма ввода документов

Тут есть блокировка и запрета одновременного ввода несколькими пользователями. Решать можно по разному.
Но проблем "списание", "остатков на складе" и так далее нет. По определению

2. Проведение операций (транзакций) в системе.

Тут обычно нет проблемы "длинных транзакций". Все транзакции обычно короткие.

Если одно с другим не смешивать - особых проблем быть не должно

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

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

по деньгам просто если параллельно вдруг так случится отработают две транзакции просто в худшем случае без всяких блокировок выйдет так что (кажется в 1с это регистр называется ) так вот регистр у клиента будет показывать на счету 100 рублей, а по факту (и по логу денежных транзакций) у него 150 рублей. это в самом худшем для него случае. надо просто пересчет делать.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195279
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2,
ну, если про помидоры всё понятно, то и отлично.
- вопрос про спринг не подскажу. Я не люблю внешнее управление транзакциями. Без меня)).
Да и вопрос уже не совсем как про хибер будет.
Удачи!
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195293
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Петро, благодарю за помощь и разъяснения! И Блачковича тоже.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39195953
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123lor2в обоих случаях надо городить логику
конечно надо.
Например, в десктопе длинная пессимистик:
====================
- в Урюпинске чел СМОТРИТ список товаров (select обычный)
- нажимет на выбранном товаре РЕДАКТИРОВАТЬ = (select update)
(если заснул, то все ругаются кто заблокировал)
- OK = Commit = выход из блока и гарантия что никто в минус не ушёл

Например, в десктопе КОРОТКАЯ пессимистик:
================
- (select update) только в момент изменения значения как выше в сервлете

Оптимистик будет хибером при сохранеии вылетит что НЕ ПОЛУЧИЛОСЬ.
...
Типо так.
За такие вещи обычно канделябром...
Какие нафиг блокировки при работе в многопользовательском режиме?
Это все здорово, пока 2 чела. А если 22? Кто из них уснул? Особенно в распределенном
сервисе? Надо просто update корректно составлять. Но у меня другой вопрос. Вот если
что-то пошло не так, как я могу в том же самом распрекрасном Hibernate вычислить статус
сущности? До этого они надеюсь за 5 лет дошли? Или нет?
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39196063
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на колу мочало начинай сначала ) по ходу сколько людей - столько мнений..
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39196076
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2на колу мочало начинай сначала ) по ходу сколько людей - столько мнений..
Так вопрос серьезный. Я из-за этих "конфликтных" ситуаций и послал лесом хибернейт в свое время.
Потому что ни в одной методичке не написано - а что делать, если, к примеру, свалился запрос
на обновление записи. Один, правда, вариант, я прочитал - закрываем менеджер сессий, начинаем
новый. Подумал - странно, почему сервер не перегрузить тогда уж.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39196112
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я слышал как то одно интервью гослинга на тему конкуренси и ему задали подобный вопрос на что он сказал что вы только что озвучили очень хорошую тему для диссертации ))
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39196167
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2я слышал как то одно интервью гослинга на тему конкуренси и ему задали подобный вопрос на что он сказал что вы только что озвучили очень хорошую тему для диссертации ))
о как.
...
Рейтинг: 0 / 0
Hibernate разрешение конфликтных ситуаций?
    #39196515
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexJm,

да он там еще что то про многопроцессорные системы говорил типа вот вы думаете сложно когда ядра два там или четыре или целых восемь, а если их будет 512?
...
Рейтинг: 0 / 0
108 сообщений из 108, показаны все 5 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate разрешение конфликтных ситуаций?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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