|
|
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
допустим у меня есть код внутри транзакции: бронирование помидоров на складе. 1) проверяем остатки помидоров на складе. если надо меньше помидоров чем остатки то - бронируем и вычитаем из остатков. если больше - то отказ. ---конец--- теперь у меня допустим, на складе 20 помидоров. идет первая транзакция - бронируем 15 помидоров. вторая транзакция - бронируем 10 помидоров. если они последовательно выполняются у нас получается что проходит первый бронькнул 15 остатки 5 второму - отказ. если они идут одновременно: допустим, оба сделали проверку, оба получили тру. первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5??? как в данном случае пройдет конфликт? при условии что проверка и коммит внутри одной транзакции. мне сказали что там какой то момент с версионированием, проходит оптимистичная блокировка. но что то толком не нашел инфы об этом в инете. или ни у кого такого не возникает и хибер сам разводит всё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 13:58 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2, вам надо почитать про уровни изоляции транзакций. Вам скорее всего подойдет READ_COMMITTED ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:05 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник, хорошо, значит получается в конфиге по умолчанию такой вариант произойти может да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:09 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2забыл ник, хорошо, значит получается в конфиге по умолчанию такой вариант произойти может да? Я точно не помню, врядли READ_UNCOMMITED стоит по дефолту, скорее всего как раз READ_COMMITTED, если вы только сами не переопределили. Отвечая на ваш вопрос - хорошо что вы об этом задумываетесь, но хибер разрулит в вашем случае. в отличие от plain jdbc(правда и там можно выставить Connection autoCommit=false). Хотя я тут подумал, смотря еще какой у вас код, можете показать sql? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:15 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
если они идут одновременно: допустим, оба сделали проверку, оба получили тру. первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5??? Что значит "тяпнул" ? Если заблокировать, то нет, не будет - т.к. второй не сможет заблокировать уже заблокированное. Будет exception ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:17 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Нет, Hibernate ничего сам не разрулит. При этом Hibernate это только инструмент, и прежде чем вы его начнете применять, хорошо бы понимать как он работает. Поэтому для начала нужно понять две вещи 1) Теория заключается в том что надо выбрать между - Пессимистической блокировкой, которая на уровне БД выглядит как SELECT FOR UPDATE. (Блокировка простая и надежная, но она выстраивает запросы в очередь и под высокой нагрузкой и при большой конкуренции начинаются сложности.) ... и оптимистичной блокировкой, которая достаточно просто реализована в хибере в виде @Version поля. Обе транзакции вычитывают свободные помидоры, обе пытаются их отнять от общего количества, но если это происходит одновременно, то одна из транзакций выхватывает исключения оптимистической блокировки. И уже вам как кодеру нужно решить что вы делаете с этим исключением. Это решение хорошее, но нужно правильно продумывать обработку исключения. 2) Практика же иногда предлагает на много более простые решения, как например, SQL запрос выборки с одновременной валидацией значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:17 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
я нашел вот это: setProperty("hibernate.connection.isolation", "2"); где уровень указвается. и да, что то читал насчет версионинга но в инете инфы как то маловато. значит люди с этим не сталкиваются. в практике же "посчитать количество помидор и отнять помидоры" это слишком коротакая транзакция и может действительно с этим по этой причине и не сталкиваются. скулем пользвоаться бы не хотелось по возможности. касательно аннотации @Version тоже не совсем ясно для меня как оно работает. я что ставлю эту аннотацию и проблема решена чтоль? чуть ранее я задавал тут похожий вопрос - мне сказали - когда засовываешь всё в одну транзакцию то типа "так не будет" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:21 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2я нашел вот это: setProperty("hibernate.connection.isolation", "2"); где уровень указвается. и да, что то читал насчет версионинга но в инете инфы как то маловато. значит люди с этим не сталкиваются. в практике же "посчитать количество помидор и отнять помидоры" это слишком коротакая транзакция и может действительно с этим по этой причине и не сталкиваются. скулем пользвоаться бы не хотелось по возможности. касательно аннотации @Version тоже не совсем ясно для меня как оно работает. я что ставлю эту аннотацию и проблема решена чтоль? чуть ранее я задавал тут похожий вопрос - мне сказали - когда засовываешь всё в одну транзакцию то типа "так не будет" :) Опять же, смотря что вы подразумеваете под посчитать помидоры и отнять. Как это реализовано? В протейшем случае если есть таблица помидоры, и у нее есть поле количество а ваш код выглядит так: Код: java 1. 2. 3. 4. и есть check constraint что поле count не может быть < 0, то достаточно выставить правильный уровень изоляции. При отсутствии констрейнта хибер сам не разгребет, и тд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:27 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
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чуть ранее я задавал тут похожий вопрос - мне сказали - когда засовываешь всё в одну транзакцию то типа "так не будет" :) Сложно дать точный ответ на помидорах. Нужно точное описание процесса и транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:29 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
да, про уровень изоляции транзакций это я не в ту степь немного, но опять же зависит от кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:31 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник Код: java 1. 2. 3. 4. Можно даже что-то типа UPDATE pomidors SET count = count - order.count WHERE count >= order.count. И потом смотреть количество измененных записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:31 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczзабыл ник Код: java 1. 2. 3. 4. Можно даже что-то типа UPDATE pomidors SET count = count - order.count WHERE count >= order.count. И потом смотреть количество измененных записей. И правда, отличный вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:31 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
так вот и всё описание: есть объект класса помидоры. у помидоров есть поле "количество". есть объект класса резервация, там есть тоже поле "количество". у помидора связь с резервацией ван ту мени. (если это важно) процесс выглядит так 1) загружаем в помять объект помидор. проверяем количество помидоров на складе по полю "количество" в объекте помидор, если количество помидоров больше количества в брони то 2а) отнимаем от объекта помидор количество в брони и обновляем объект помидор в базе. следом сохраняем резервацию. 2б) если в брони больше чем остатков то выходим с сообщением что бронь неверна. собссно всё. если ты говори что при помечении поля аннотацией @Version у меня произойдет ексцепшн на момент коммита, то в принципе - тут уже ясно что делать. скажем юзеру извини - долго собирался. теперь вопрос - как устанавливать тип блокировки в хибере на отдельные транзакции? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:38 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, может быть, но блин. неужель без скуля никак не получится обойтись? :) я ведь даже выборки по критериям стараюсь делать. чтоб скуэля по минимуму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:40 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:46 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
вот. у нас две таблицы итемПати (серия) и резервация (резервация) автор @Transactional public void addReservation(Reservation reservation) { ItemParty itemParty = daoItemParty.getItemPartyById(reservation.getItemParty().getId()); if(itemParty.getAmount()>reservation.getAmount()){ dao.addReservation(reservation); }else { ...шлем в пень.... } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:48 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник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); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:52 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
пардон, вот так вот : автор@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 { ...шлем в пень.... } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:57 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2теперь вопрос - как устанавливать тип блокировки в хибере на отдельные транзакции? :) Не понял вопроса. Добавляешь поле и @Version на него и получаешь результат. Какие ещё "отдельные транзакции"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:58 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никВ вашем случае хибер сам не разрулит, даже с аннотацией Version. Почему нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 14:59 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczзабыл никВ вашем случае хибер сам не разрулит, даже с аннотацией Version. Почему нет? Потому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:02 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никПотому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще Ну, да. Всё зависит от системы и требований. Имеет ли смысл показать сообщение пользователю "ой а помидоров уже 20, а не 30", если он хотел резервировать всего 10? Где-то имеет, а где-то нет. Зависит от требований. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:15 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2может быть, но блин. неужель без скуля никак не получится обойтись? :) я ведь даже выборки по критериям стараюсь делать. чтоб скуэля по минимуму. На HQL/JPQL можно запрос написать. Стремиться к критериям ради критериев? Зачем? HQL проще читается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:16 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никПотому что было 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 не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:21 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, так а я про что? Вы меня наверное с ТС перепутали, вариантов множество, все зависит от системы и требований. Я просто отвечал почему оптимистичная блокировка здесь не самый лучший вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:25 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczзабыл никПотому что было 30 помидоров, один заказ на 10 и второй на 10, оба вычитали что каунт = 30, первый успешно закомиттил и коунт стал 20, второй пробует сделать update count where count =30, получает отлуп, и тут уже надо разбираться? Нет ну можно замутить какой-то retry, но это усложнение с неочевидным профитом. Те варианты проще Ну, да. Всё зависит от системы и требований. Имеет ли смысл показать сообщение пользователю "ой а помидоров уже 20, а не 30", если он хотел резервировать всего 10? Где-то имеет, а где-то нет. Зависит от требований. в моем случае достаточно отнять и забыть. вот если не хватает - тогда сруо эксепшн и уже его обработать. показать типа - извините но на складе уже меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:28 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2Blazkowiczпропущено... Ну, да. Всё зависит от системы и требований. Имеет ли смысл показать сообщение пользователю "ой а помидоров уже 20, а не 30", если он хотел резервировать всего 10? Где-то имеет, а где-то нет. Зависит от требований. в моем случае достаточно отнять и забыть. вот если не хватает - тогда сруо эксепшн и уже его обработать. показать типа - извините но на складе уже меньше. Вы не совсем поняли, в случае с оптимистичной блокировкой(аннотация Version) эксепшен будет как в случае если помидоров реально нет, так и в случае когда их количество изменилось после того как вы прочитали их количество, но перед тем как сохранили резервацию. И этот случай вам придется обрабатывать дополнительно, ведь пользователю пофиг что их стало не 30 а 20, то есть одна аннотация вас не спасет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:31 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник, но я же могу повторно просто чек сделать и всё. если снова вылетает я снова чек делаю и до тех пор пока либо оно не отнимет и не закоммитит резервацию либо пока меньше нуля не станет и оно не вернется сообщением юзеру. не знаю правда, как этот подход с точки зрения красоты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:36 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2но я же могу повторно просто чек сделать и всё. если снова вылетает я снова чек делаю и до тех пор пока либо оно не отнимет и не закоммитит резервацию либо пока меньше нуля не станет и оно не вернется сообщением юзеру. не знаю правда, как этот подход с точки зрения красоты. Нормальный подход, если есть гарантия выхода из цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:38 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
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 не будет ох как всё сложно. а в туториалах всё так просто :) выходит, без скуля/хкуля никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:38 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2забыл ник, но я же могу повторно просто чек сделать и всё. если снова вылетает я снова чек делаю и до тех пор пока либо оно не отнимет и не закоммитит резервацию либо пока меньше нуля не станет и оно не вернется сообщением юзеру. не знаю правда, как этот подход с точки зрения красоты. Несомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:39 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:41 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никНесомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java. Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить. Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:45 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
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) ???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:50 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczзабыл никНесомненно можно, выглядеть будет некрасиво и не совсем очевидно, это я сразу скажу. Но опять же все зависит от вас и от вашей системы. Лично я бы добавил просто констрейнт в базу. В крупном проекте предпочтителен вариант Leonida. Как видите проблему можно решить многими путями На самом деле это вполне себе красиво. Во-первых калькуляции могут быть сложнее чем обычное вычитание. И тут у нас вычисления все на Java, а не скомбинированы с QL. Это и есть цель ORM - держать логику на Java. Во-вторых повтор транзакции после OptimisticLockException это стандартная практика. Вопрос только в том до какого уровня транзакцию откатить. Констрейнта в базе это никак не отменяет, конечно. Но он нужен только для целостности данных, а не для валидации. Да, вы правы, все зависит от системы, наше дело предложить варианты. При большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку, если сложный sql - то возможно нативный запрос или хранимка, в остальных случаях поможет оптимистическая. Просто надо понимать что серебряной пули нет, это я ТС говорю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:51 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
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. В сервис слое заменяете дао.прочитать_Серию_с_айди на дао.ЛокПомидор все остальное остается без изменений. В конце транзакции блокировка снимется автоматом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:55 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник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 т.е. я в любом случае должен буду через скуль помечать строку в таблице фор апдейт, перед тем как сравнить значения, а после того как апдейт произошел (или не произошел) я снимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:56 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никПри большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:57 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2а пессимистическую блокировку в хибере можно делать только так? авторSELECT count FROM inventory_total WHERE item_id = :id FOR UPDATE -- Поставили блокировку -- Какая-то логика UPDATE SET count=new_count inventory_total WHERE item_id = :ID COMMIT т.е. я в любом случае должен буду через скуль помечать строку в таблице фор апдейт, перед тем как сравнить значения, а после того как апдейт произошел (или не произошел) я снимаю? Нет. Вы же привели код выше. Посмотрите в мануале, там должно быть с примерами. Раздел такой точно есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 15:58 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
ой, то есть сначала вычитываешь, потом лочишь, потом возвращаешь из дао Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:01 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczзабыл никПри большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом. Соглашусь, тогда когда бы вы рекомендовали использовать пессимистик? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:02 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник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. В сервис слое заменяете дао.прочитать_Серию_с_айди на дао.ЛокПомидор все остальное остается без изменений. В конце транзакции блокировка снимется автоматом. аллиллуя! понял. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:03 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2 т.е. я в любом случае должен буду через скуль помечать строку в таблице фор апдейт, перед тем как сравнить значения, а после того как апдейт произошел (или не произошел) я снимаю? Постарайтесь запомнить. Оптимистическая блокировка - аннотация Version. Пессимистическая - em.lock(e, LockModeType.PESSIMISTIC_READ); Как видите sql можно не писать ни там ни там, тут скорее титанические муки выбора какую же все же взять :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:04 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczзабыл никПри большой нагрузке и короткой транзакции лучше использовать пессимистическую блокировку С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом. выходит делаем через вершн и сру? и зацикливаем (ну пусть определенное число циклов а потом всё-равно вываливаемся с сообщением типа "сервер перегружен") так выходит? прочто у меня на собесе был вопрос и там чел про вершн утверждал что надо вершн использовать. а я вообще только краем уха слыхал про этот вершен и в моих проектах там транзакции были чуть больше чем ноль по времени и в общем то никаких озадаченностей с этой стороны вообще не вызывали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:07 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никСоглашусь, тогда когда бы вы рекомендовали использовать пессимистик? Когда этого явно требует бизнес-логика приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:07 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2 прочто у меня на собесе был вопрос и там чел про вершн утверждал что надо вершн использовать. а я вообще только краем уха слыхал про этот вершен и в моих проектах там транзакции были чуть больше чем ноль по времени и в общем то никаких озадаченностей с этой стороны вообще не вызывали. Выбор за вами, теперь когда вы понимаете оба варианта :) Они оба приведут к поставленной цели. П,С ALTER TABLE Tomato CONSTRAINT CHK_TOMATO_NOT_NEGATIVE CHECK (count >=0); GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 16:18 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
а такой вопрос. ексепшн при оптимистической блокировке через вершн будет выкидываться из транзакции или из метода, который применяет изменения внутри транзакции? я к чему спрашиваю - где его ловить и как обрабатывать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:02 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2а такой вопрос. ексепшн при оптимистической блокировке через вершн будет выкидываться из транзакции или из метода, который применяет изменения внутри транзакции? я к чему спрашиваю - где его ловить и как обрабатывать ) В идеале у вас есть 2 класса 1) Класс Domain Model отвечающий за бизнес-логику. Возможно Service. Так, вот валидация количества, перехват OptimisticLockException и его обработка это бизнес-логика. 2) Класс Repository (иногда DAO) отвечающий за доступ к ORM. Это тот самый класс, который делает UPDATE сущности и выкидывает OptimisticLockException. В идеале, конечно, надо смотреть где коммит в базу происходит. Либо на session.flush(), либо на session.commit(), либо на выходе из @Transactional метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:10 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczпропущено... С этим я в корне не согласен. Большая нагрузка требует отказаться от каких либо "блокировок" вообще. Optimistic Lock ничего не блокирует. А Pessimistic Lock выстраивает транзакции в очередь и становится, если не источником проблем, то как минимум узким местом. Крайне спорно. На самом деле, что одно, что другое при частых конфликтах будет становится узким местом. Но если пессимистический блокировка будет тупо стоять и ждать, то оптимистическая будет неудачными ретраями забивать и апп.сервер и базу. Админ базы или надзирающая софтина пессимистическую блокировку и/или деадлок увидит, а при оптимистической - черт знает что получится на продакшене, просто 100500 бессмысленных ретраев. Блокировка - нормальная, штатная функция БД. Никаким источником проблем (при отсутвие кривых рук программистов) не становится. И незачем подменять штатные функции БД изобретенным велосипедом в виде "ретраев" IMHO На кластерах и No-SQL наверное все не совсем так... но я их за полноценные БД не считаю ))). AFAIK Оптимистическая блокировка больше придумана для GUI. Когда оператор открыл запись на редактирование и полчаса ее держит. Тогда да, оптимистическая блокировка имеет право на жизнь. IMHO & AFAIK БЕЗ приминимости к Hibernate. P.S. Архитектуру БД нужно нормальную делать. Что бы взаимных блокировок при вычислениях было меньше и деадлоки в БД на каждом шагу не возникали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:10 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevто оптимистическая будет неудачными ретраями забивать и апп.сервер и базу. Неудачные ретраи на много проще убрать. Leonid KudryavtsevАдмин базы или надзирающая софтина пессимистическую блокировку и/или деадлок увидит Сначала его увидят юзеры, когда блокировочная RDBMS вдруг решить что больно много у нас тут блокировок, а ну всем транзакциям стой раз-два. Leonid KudryavtsevБлокировка - нормальная, штатная функция БД. Никаким источником проблем (при отсутвие кривых рук программистов) не становится. Никто не спорит. Но чем меньше у нас блокировок тем больше у нас шансов выдержать увеличение нагрузки на систему. А чем больше у нас блокировок, тем больше у нас шансов что система встанет в самый непредвиденный момент Leonid KudryavtsevИ незачем подменять штатные функции БД изобретенным велосипедом в виде "ретраев" IMHO Это не велосипед. И как я уже указал выше, если решил повторить транзакцию, то будь уверен, что система не решит повторять её вновь и вновь. Риск от кривой реализации есть в обоих сценариях. Leonid KudryavtsevAFAIK Оптимистическая блокировка больше придумана для GUI. Когда оператор открыл запись на редактирование и полчаса ее держит. Тогда да, оптимистическая блокировка имеет право на жизнь. Об этом всём я уже написал выше в теме. Leonid KudryavtsevАрхитектуру БД нужно нормальную делать. Что бы взаимных блокировок при вычислениях было меньше и деадлоки в БД на каждом шагу не возникали. Ну, вот если на каждый пук мы будем делать SELECT FOR UPDATE, то никуда от дедлоков потом не спрячешься. А если так уж так повелось что сервер какой-нибудь MySQL, то всё ещё хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:18 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczlor2а такой вопрос. ексепшн при оптимистической блокировке через вершн будет выкидываться из транзакции или из метода, который применяет изменения внутри транзакции? я к чему спрашиваю - где его ловить и как обрабатывать ) В идеале у вас есть 2 класса 1) Класс Domain Model отвечающий за бизнес-логику. Возможно Service. Так, вот валидация количества, перехват OptimisticLockException и его обработка это бизнес-логика. 2) Класс Repository (иногда DAO) отвечающий за доступ к ORM. Это тот самый класс, который делает UPDATE сущности и выкидывает OptimisticLockException. В идеале, конечно, надо смотреть где коммит в базу происходит. Либо на session.flush(), либо на session.commit(), либо на выходе из @Transactional метода. сейчас у меня в приложении три слоя - дао, сервис, контроллеры. @Transactional естественно на уровне сервиса. я не понимаю ОЛЕ выкинет меня сразу же из метода с меткой @Transactional или... где?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:52 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2, в смысле ексепшн залетит в контроллер? при такой схеме? или мне надо промежуточный слой между сервисом и контроллером создавать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:54 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2сейчас у меня в приложении три слоя - дао, сервис, контроллеры. @Transactional естественно на уровне сервиса. я не понимаю ОЛЕ выкинет меня сразу же из метода с меткой @Transactional или... где?? Можно явно вызвать коммит у сессии и там ловить исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 17:57 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczlor2сейчас у меня в приложении три слоя - дао, сервис, контроллеры. @Transactional естественно на уровне сервиса. я не понимаю ОЛЕ выкинет меня сразу же из метода с меткой @Transactional или... где?? Можно явно вызвать коммит у сессии и там ловить исключение. т.е. я в дао создаю еще один метод типа "коммит_транзакшн" вызываю его в сервисном слое и там же окружаю трайкечем? по-моему вообще макарон-пакарон получается. не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:23 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
можно решить и по другому - начал выбирать - тебе всплыла подсказка - этот товар зарезервирован тем-то, в таком количестве ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:30 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
вадяможно решить и по другому - начал выбирать - тебе всплыла подсказка - этот товар зарезервирован тем-то, в таком количестве Как вариант в сервисе сделать два метода. Один содержащий логику БД, ну то есть ваш первоначальный вариант, обернуть его в Transactional, а второй метод это вызов первого и обработка OptimistickLocking ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:33 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
не то процитировал сорри ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:34 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2т.е. я в дао создаю еще один метод типа "коммит_транзакшн" вызываю его в сервисном слое и там же окружаю трайкечем? по-моему вообще макарон-пакарон получается. не? Ну, не же. У тебя в сервисе: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. А в DAO Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:37 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА в DAO Код: java 1. 2. 3. А если update вызывается из нескольких мест? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:46 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никlor2, вам надо почитать про уровни изоляции транзакций. Вам скорее всего подойдет READ_COMMITTED SERIALIZABLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 18:49 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
ох. а оказывается @Version нельзя поставить на стринг! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 19:00 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл никА если update вызывается из нескольких мест? Так DAO не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 19:00 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2ох. а оказывается @Version нельзя поставить на стринг! Вы реально даже не пытаетесь понять что этот version делает и как работает optimistic lock? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 19:01 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
ну я понял так - ставим в какое-то поле аннотацию вершн и теперь у нас получается что в случае коммита каких то изменений этого объекта одна из транзакций будет выкидывать ексепшн. не?? сейчас сижу бьюсь. автор 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); } запускаю это вот внутри транзакции через секунду два раза. (две транзакции) никаких ексепшенов не вываливается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 19:26 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2ну я понял так - ставим в какое-то поле аннотацию вершн и теперь у нас получается что в случае коммита каких то изменений этого объекта одна из транзакций будет выкидывать ексепшн. не?? сейчас сижу бьюсь. Нет, это специально поле должно быть, не ленитесь почитайте про эту аннотацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 19:29 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
забыл ник, блин. просто забыл аннотацию саму поставить, совсем мозги заклинило :) спасибо всё работает сроу выкидывается. НО. делал по этому варианту 1 к 1: Blazkowiczlor2т.е. я в дао создаю еще один метод типа "коммит_транзакшн" вызываю его в сервисном слое и там же окружаю трайкечем? по-моему вообще макарон-пакарон получается. не? Ну, не же. У тебя в сервисе: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. А в DAO Код: java 1. 2. 3. один фиг выкидывает ексепшн в контроллер. причем вначале он в дао ловится, потом не ловится в сервисе вообще никак. даже ексепшн чистый. и улетает в контроллер (там ловится). бред какой то. хотя может так и правильно. словили в контроллере и там же решили репит или показать клиенту что-нибудь ругательное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 20:29 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
вот интересно с оптимистиком залупил чтоб пробовал с рандомной задержкой заново и заново сохранить. так и не дождался когда с десяток запросов отработается. потом сделал с пессимистиком. причем пессимистик локать не давал когда залочено. алгоритм анлогичный - пробуем залочить если не вышло ждем рандомное время и еще раз пробуем (всего 10 попыток) -- отстрелялись все транзакции. блин. ява это что то с чем то :) я ее люблю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2016, 21:48 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
MasterZivSERIALIZABLE.Пристрелил бы ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 18:49 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
копаю дальше... такая тема когда пессимистически ставлю лок, то у меня последующие транзакции выкидывают сразу же ексепшн :) а я думал они просто висеть будут и ждать своей очереди. а они не ждут. или я что то не так делаю? как сделать очередь? иначе я разницы с @Version не вижу кроме разве что типа выбрасываемого ексепшна. причем оба кидаются в контроллер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2016, 19:48 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2копаю дальше... такая тема когда пессимистически ставлю лок, то у меня последующие транзакции выкидывают сразу же ексепшн :) а я думал они просто висеть будут и ждать своей очереди. а они не ждут. или я что то не так делаю? как сделать очередь? иначе я разницы с @Version не вижу кроме разве что типа выбрасываемого ексепшна. причем оба кидаются в контроллер. Какой ексепшн? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2016, 19:50 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, в каком случае? в случае аннотации вершн там что то вроде ОЛЕ вылетает но не ОЛЕ, в случае пессимистика - другая. могу завтра уточнить. но точно они разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2016, 21:01 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, при пессимистической блокировке если у меня запускается мешок транзакций, то несколько исполняются в очереди, а остальные сыпятся с ошибкой: Код: sql 1. 2. 3. 4. т.е. я так понимаю транзакции выстраиваются в очередь, и те что успели отработать - отработали, а те что нет - тупо ексепшн: я так понимаю надо либо где то этот таймаут увеличивать, (хз где? это хиберская штучка или бдшная уже?) либо ловить ексепшн и долбить пока не додолбится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:24 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2я так понимаю надо либо где то этот таймаут увеличивать , (хз где? это хиберская штучка или бдшная уже?) либо ловить ексепшн и долбить пока не додолбится. Может просто сказать транзакции Serializable и пусть сервер их в очередь выстраивает сам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:42 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, изьвиняюсь, как это в хибере делается - вариант Код: java 1. чот ругается. да и в таком случае я логики работы не понимаю если у меня пару транзакций сериалайзбл, а остальные нет? )) откуда он узнает что и как раскладывать. нет, у меня нет вопросов если я всю базу просто помечаю на четвертый (сериалайзбл) уровень изоляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:54 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2, у тебя логика должна - наложили блок, работаем, соммит (сняли) Дак вот, когда пошла первая транзакция с select for update, то после райзе надо откатывать все технические транзакции в одной бизнес-транзакции. А долбится или нет решается на самом верху. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:57 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2 Код: java 1. я бы сервер не трогал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:58 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2при пессимистической блокировке если у меня запускается мешок транзакций, то несколько исполняются в очереди, а остальные сыпятся с ошибкой: 18835378 Я вам первым же сообщением написал что пессимистик не годится для высоких нагрузок. Сколько у тебя продавцов томатов что они усердно за них конкурируют? Если ты highload пишешь для высокой конкурентности, то тебе блокировки вообще не подходят ни в каком виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 17:05 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123у тебя логика должна - наложили блок, работаем, соммит (сняли) lor2, проверь, где это у тебя происходит? - в десктопе - сиди в локе хоть целый день. - в вебе обычно это в сервлете или ещё где, за 0,01 секунды! imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 17:16 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczlor2при пессимистической блокировке если у меня запускается мешок транзакций, то несколько исполняются в очереди, а остальные сыпятся с ошибкой: 18835378 Я вам первым же сообщением написал что пессимистик не годится для высоких нагрузок. Сколько у тебя продавцов томатов что они усердно за них конкурируют? Если ты highload пишешь для высокой конкурентности, то тебе блокировки вообще не подходят ни в каком виде. да это всё ясно конечно же. я о том, чтоб разобраться в нюансах работы. а вообще, у меня товарищ есть скулевец, он вообще лютый проповедник-пессимист. для него опт. принципиально не существует. ну видимо, мнений много разных. в практике у меня продавцов томатов не так уж и много, но вероятность что забронят больше, чем есть на складе свободного (если не морочиться блокировками) есть. по факту я конечно же там сделал тупо версионность как страховку и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 09:42 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2, ты не путай транзакции хибера, бизнес и технические. в сервлете у тебя должно так: ВИ №1 ОРМ + пессимистик + короткие ===================== за 0,01 сек Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 12:38 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5??? технический овердрафт по дебетовой карте)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 12:47 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123, ахахаха точно. оно и есть. значит они тоже мучаются с такими проблемами. Петро, ты извини, я просто не умею думать скулем, я думаю хиберовскими шаблонами :) разумеется, если речь о транзакции то это в рамках хибера. скажу более речь (с моей стороны) идет в рамках методов, помеченных аннтотацией "транзакшионал". идею в общем то понял, просто для меня грань еще более размытой стала между лок на чтение и оптимистик. если я делаю лок на чтение то последующие транзакции типа "в очереди ждут" а потом отваливаются бросая ексепшн, если ждут "долго", в оптимистике у меня тупо сразу же если версия изменилась идет откат транзакции и так же вылетает ексепшн. в обоих случаях надо городить логику как себя вести при ексепшене. либо ждать либо юзера посылать подальше либо еще что-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 14:31 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2значит они тоже мучаются с такими проблемами ты про банки? Они не мучаются). Наоборот переложи на плечи клиентов свои проблемы. Транзакции то - отложенные и распределённые. Иначе ни как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 15:12 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2в обоих случаях надо городить логику конечно надо. Например, в десктопе длинная пессимистик: ==================== - в Урюпинске чел СМОТРИТ список товаров (select обычный) - нажимет на выбранном товаре РЕДАКТИРОВАТЬ = (select update) (если заснул, то все ругаются кто заблокировал) - OK = Commit = выход из блока и гарантия что никто в минус не ушёл Например, в десктопе КОРОТКАЯ пессимистик: ================ - (select update) только в момент изменения значения как выше в сервлете Оптимистик будет хибером при сохранеии вылетит что НЕ ПОЛУЧИЛОСЬ. ... Типо так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 15:18 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123lor2первый тяпнул 15 второй тяпнул 10 на выходе получаем минус 5??? технический овердрафт по дебетовой карте)) Я с технический "овердрафт по дебетовой карте" сталкивался только тогда, когда КОММИСИЯ банка не помещалась в остаток по счету. Т.е. деньги у меня есть, а вот на КОММИСИЮ банка(ов) не хватило Дебетовая карточка, которая позволяет лихо "тяпать 15 кг. помидоров и потом без денег еще 10" - не видел. Мало того, некоторые банки свою коммисию даже в выписку по карточному счету не включают. Сам так лет 15 назад пытался выяснить, почему деньги на начало периода - выписка по счету != деньги на конце периода. Оказалось, что ежегодный платеж за пользованием карточкой в выписку не включается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 15:18 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, я хз у меня есть валютная визакард, и действительно раз вышло что на алиюшке заказал два товара на сумму больше чем по карте и карта ушла в минус )) карта дебетовая. покупки делал подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 15:36 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
чота я щас сижу и думаю, что оказывается у меня очень много случаев работы с базой когда может произойти лютый треш если не делать хоть какую то блокировку, аж волосы на спине зашевелились. )) типа одна транзакция закидывает бабки а другая их списывает. и может выйти так что списала с той суммы, которая была до закидывания первой транзакцией в итоге закидывание вообще пропадает но списание проходит. ненене. версионирование - без него по ходу никуда. кстати, ткой вопрос в контексте спринга и его аопа. вот у меня приложение, ну как положено транзакшн манагер и всё такое. каждый метод, где хибер работает в сервисном слое я помечаю аннотацией транзакшнл и т.п. теперь собссно вопрос: спринг в хибер один раз открыл сессию на момент скажем так инициализации и всё время ее держит открытой? или открывает закрывает каждый раз с запуском метода помеченного транзакшнл? или там еще какой то механизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 09:27 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2теперь собссно вопрос: спринг в хибер один раз открыл сессию на момент скажем так инициализации и всё время ее держит открытой? или открывает закрывает каждый раз с запуском метода помеченного транзакшнл? или там еще какой то механизм? https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate3/HibernateTransactionManager.html По-умолчанию одна сессия на одну транзакцию. При остром желании это можно изменить, но нужно понимать что делаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 09:39 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2версионирование - без него по ходу никуда. Ты не учился в ВУЗе? ))) Первое что делают - списывают и ищут "рыбу". - найди аналог из сети твоего ВИ \ use case. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:09 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2может произойти лютый треш если не делать хоть какую то блокировку, аж волосы на спине зашевелились. )) "Компромиссы и проблемы" http://www.k-press.ru/cs/2009/3/ts/ts.asp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:12 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123lor2версионирование - без него по ходу никуда. Ты не учился в ВУЗе? ))) Первое что делают - списывают и ищут "рыбу". - найди аналог из сети твоего ВИ \ use case. я учился в вузе 6 лет, но мое направление хоть и связано с техникой, но мало связано с программированием. автор По-умолчанию одна сессия на одну транзакцию. При остром желании это можно изменить, но нужно понимать что делаешь. просто есть мнение что открытие и закрытие сессии в хибере отгрызает достаточно много ресурсов и делая много мелких тразакций ты эти ресурсы будешь под себя подгребать. с другой стороны делая мало длинных трнанзакций ты тоже получаешь определенные недостатки. что лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:13 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2типа одна транзакция закидывает бабки а другая их списывает общее правило - Ты должен страться уйти вообще от блокировок. Тебя не смущает, что ты просматриваешь тут тему, а она может быть удалена админом в данный момент. Или мы смотрим на звезду, а она уже миллионы лет не существует)). ... Сначала помидоры разбери, прежде чем везде версии совать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:17 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2что лучше вошёл в сервлет = открыл вышел из сервлета = закрыл и забыл. Разве не очевидно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:19 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2просто есть мнение что открытие и закрытие сессии в хибере отгрызает достаточно много ресурсов Мнение авторитетное или так себе? Открытие сессии не стоит ничего. Закрытие, естественно, отжирает ресурсы, так как оно связно с обновлением состояния и коммитом транзакции. lor2 и делая много мелких тразакций ты эти ресурсы будешь под себя подгребать. Это лирика, которая к технической стороне вопроса никакого отношения не имеет. lor2 с другой стороны делая мало длинных трнанзакций ты тоже получаешь определенные недостатки. Короткие транзакции лучше, это в каждом букваре написано. Чем короче транзакции, тем меньше между ними соперничества, тем меньше системе нужно тратить ресурсов на разруливание конкуренции. А на тупых блокировочниках типа MySQL длинные транзакции это смерть системы под нагрузкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:19 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz тебе уже сказал. Откуда мелкие транзакции тогда могут у тебя произойти? При декларативных ставь то, что написано выше статье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:22 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123вошёл в сервлет = открыл вышел из сервлета = закрыл и забыл. Разве не очевидно? Если сервлет это бизнес-транзакция, то да. А если это всего лишь View к бизнес-слою, то, наверное, не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:33 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Да уж. Читаю и волосы встают дыбом. А еще меня удивляло, как система мировой лидер ( Oracle Customer Care & Billing, SPL WG Customer Care & Billing) умудряется ничего не блокировать и создавать одному клиенту по два одинаковых счета на одну и ту же дату. Тот же подход... Hibernate, @Version и не е#$т ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:42 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли сервлет это бизнес-транзакция, то да. А если это всего лишь View к бизнес-слою, то, наверное, не надо. да, конечно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:44 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Вчера набивал ответ в данную тему, потом стер. Т.к. IMHO вопрос топикастера с Java и Hibernate связан слабо. Концептуально проблема как организована работа с системой и данными. И вопрос скорее относится к форуму ERP. Т.к. я бы разделял две задачи: 1. Форма ввода документов Тут есть блокировка и запрета одновременного ввода несколькими пользователями. Решать можно по разному. Но проблем "списание", "остатков на складе" и так далее нет. По определению 2. Проведение операций (транзакций) в системе. Тут обычно нет проблемы "длинных транзакций". Все транзакции обычно короткие. Если одно с другим не смешивать - особых проблем быть не должно IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 10:51 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКороткие транзакции лучше, это в каждом букваре написано. Чем короче транзакции, тем меньше между ними соперничества, тем меньше системе нужно тратить ресурсов на разруливание конкуренции. А на тупых блокировочниках типа MySQL длинные транзакции это смерть системы под нагрузкой. я по собеседованиям походил и такого наслушался, что уже сам себе не верю. да, я так же считаю как ты написал. вернее я так не считаю я так читал в куче источников. Петро, так что там насчет помидоров то не так? процесс прост как дважды-два: есть помидоры - откусываем от доступных остатков - перекладываем в заброньканые остатки-коммитимся. нет помидоров - идем мимо. по деньгам просто если параллельно вдруг так случится отработают две транзакции просто в худшем случае без всяких блокировок выйдет так что (кажется в 1с это регистр называется ) так вот регистр у клиента будет показывать на счету 100 рублей, а по факту (и по логу денежных транзакций) у него 150 рублей. это в самом худшем для него случае. надо просто пересчет делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:26 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2, ну, если про помидоры всё понятно, то и отлично. - вопрос про спринг не подскажу. Я не люблю внешнее управление транзакциями. Без меня)). Да и вопрос уже не совсем как про хибер будет. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:41 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123, Петро, благодарю за помощь и разъяснения! И Блачковича тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:54 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
Petro123lor2в обоих случаях надо городить логику конечно надо. Например, в десктопе длинная пессимистик: ==================== - в Урюпинске чел СМОТРИТ список товаров (select обычный) - нажимет на выбранном товаре РЕДАКТИРОВАТЬ = (select update) (если заснул, то все ругаются кто заблокировал) - OK = Commit = выход из блока и гарантия что никто в минус не ушёл Например, в десктопе КОРОТКАЯ пессимистик: ================ - (select update) только в момент изменения значения как выше в сервлете Оптимистик будет хибером при сохранеии вылетит что НЕ ПОЛУЧИЛОСЬ. ... Типо так. За такие вещи обычно канделябром... Какие нафиг блокировки при работе в многопользовательском режиме? Это все здорово, пока 2 чела. А если 22? Кто из них уснул? Особенно в распределенном сервисе? Надо просто update корректно составлять. Но у меня другой вопрос. Вот если что-то пошло не так, как я могу в том же самом распрекрасном Hibernate вычислить статус сущности? До этого они надеюсь за 5 лет дошли? Или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 11:37 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
на колу мочало начинай сначала ) по ходу сколько людей - столько мнений.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 16:28 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2на колу мочало начинай сначала ) по ходу сколько людей - столько мнений.. Так вопрос серьезный. Я из-за этих "конфликтных" ситуаций и послал лесом хибернейт в свое время. Потому что ни в одной методичке не написано - а что делать, если, к примеру, свалился запрос на обновление записи. Один, правда, вариант, я прочитал - закрываем менеджер сессий, начинаем новый. Подумал - странно, почему сервер не перегрузить тогда уж. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 16:50 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
я слышал как то одно интервью гослинга на тему конкуренси и ему задали подобный вопрос на что он сказал что вы только что озвучили очень хорошую тему для диссертации )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 18:02 |
|
||
|
Hibernate разрешение конфликтных ситуаций?
|
|||
|---|---|---|---|
|
#18+
lor2я слышал как то одно интервью гослинга на тему конкуренси и ему задали подобный вопрос на что он сказал что вы только что озвучили очень хорошую тему для диссертации )) о как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 19:44 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2124254]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
132ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 508ms |

| 0 / 0 |
