powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / уровень изоляции транзакций и Hibernate
9 сообщений из 9, страница 1 из 1
уровень изоляции транзакций и Hibernate
    #37696723
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый вопрос. Какая связь существует между уровнем изоляции транзакций, параметрами JPA Lock.READ / Lock.WRITE и версиями @Version(Оптимистическая блокировка). Я более менее понял по отдельности каждую из этих 3 разделов, но не понимаю, как они связаны между собой. Выбранный уровень изоляции транзакций дает некие «гарантии» при проведении операций с таблицами. Параметры Lock.READ/Lock.WRITE позволяют добиться блокировки полей таблицы при проведении операций. Если я правильно понял для этого как раз и используются поле @Version. Но все таки не до конца улавливаю связь между эти тремя понятиями. Или они дополняют друг друга, или это разные способы решения одних и тех же проблем. В общем, буду очень благодарен за ответ или же ссылку где можно прочесть информацию именно по вопросы связи между этими понятиями и их совместном использовании.

Второй вопрос. Каким способом в Hibernate можно указать требуемый уровень изоляции транзакции для конкретной транзакции. И принято ли так делать.

Спасибо.
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37696863
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
- изоляцию транзакции БД лучше не трогать, по умолчанию read commited на всех БД.
- т.к. транз. короткие в веб (часть секунды), то половина параметров не исп-тся.

LockMode.NONE – по умолчанию
LockMode.READ – обходит кеш и лезет сразу в БД (напр. при длинной транзакции с неск.реквестами)
LockMode.UPGRADE – пессимистич.блок
LockMode.UPGRADE_NOWAIT – пессимистич.блок
LockMode.WRITE – ставит сам хибер.
ИТОГО НИЧЕГО НЕ ТРОГАТЬ - использовать логическую бл-ку на которую заточен хибер.
ЗЫ.
При длинных траннз. можно предупредить Иванова заранее, что Петров взял объект на редактирование (LockMode.UPGRADE).

Вот пример исп-ия версии, но опять же, неактуально для коротких в сервлетах
http://www.sql.ru/forum/actualthread.aspx?tid=891420

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

Спасибо.
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37696943
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm,
2 варианта многопольз.доступа к 1 рессурсу
- удлиннить транзакцию в десктопе (на 20 мин держать открытой сессию хибера)
ВИ - открыть обе сущности с 2-х экземпляров программы и работать

или
- в короткой в вебе одновременно править карточку Одного клиента сразу.
Увидишь результат как в бизнес логике, так и в отладке.
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37697271
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКакая связь существует между уровнем изоляции транзакций, параметрами JPA Lock.READ / Lock.WRITE и версиями @Version(Оптимистическая блокировка)

Никакой.

Сначала, про Lock.READ / Lock.WRITE и @Version.
Это всего лишь два способа блокировки записи, первый(Lock.READ / Lock.WRITE) это прямое указание БД залочить запись, используется когда вы практически гарантированно уверенны, что одна и та же запись будет одновременно редактироваться разными пользователями, если один из пользователей открыл запись посредством Lock.READ / Lock.WRITE - второй пользователь просто тупо не сможет доступиться до этой записи, пока первый не снимет лок. Эта стратегия использования блокировок - называется пессимистичная блокировка, в самом названии содержится основной ее смысл - вы "пессимистично" предполагаете что доступ к записи на редактирование будет с высокой вероятностью перекрываться между разными пользователями. Это довольно дорогостоящая операция, и возможность масштабирования вашего приложения сильно уменьшается, таким образом практически ее стараются не использовать, а вместо нее используют оптимистическую блокировку.

@Version - это стратегия блокировки записи, которая по сути и не является блокировкой, в этом случае мы предполагаем что параллельного доступа к одной записи в большинстве случаев не будет. Как это все происходит на практике - в поле сущности добавляется аннотация @Version - которая автоинкременится при каждом последующем редактировании. Рассмотрим ситуацию, когда первый пользователь загрузил Book с id =2 и version =4, он меняет ее названия и пытается сохранить изменения - em.update(book). Что делает хибернейт, он создает запрос - update book where id=1 and version =4 set ...... Так вот, если с момента как пользователь загрузил книгу и моментом когда он ее пытается сохранить, никакой другой пользователь не проапдейтил книгу, то у нее останется версия=4, следовательно sql-запрос отработает нормально и данные сохранятся. Если же другой пользователь успел в этот момент проапдейтить книгу - то ее версия изменится на допустим =5, и sql запрос не отработает, хибернейт это дело определит и кинет соответствующий Exception - мол эта запись была отредактирована другим пользователем. В ваши обязанности входит перехватить это исключение и обработать в зависимости от use-case, вы можете либо заново вытащить этот book и заставить пользователя заново все вводить, либо как то смерджить и показать пользователю что изменилось и пусть он сам решает, либо тупо программно смерджить и попробовать сохранить снова, если есть уверенность что ничего не сломается. Таким образом получается что оптимистическая блокировка - это вовсе и не блокировка а просто предохранительное средство для того чтобы обнаружить конкурентные модификации в вашем приложении. Так как в большинстве случаев так и происходит, то цена оптимистической блокировки - практическа равна нулю, не считая лишнего поля в энтити. Таким образом ваше приложение совсем не теряет в возможности масштабирования.

Краткое резюме - пессимистическая блокировка используется при 1) большой вероятности коллизий 2) на очень больших формах, чтобы гарантированно не заставлять пользователя перезаполнять огромные формы(этот случай гораздо реже чем 1
В остальных случаях предпочтение отдается пессимистической блокировке.

Теперь об уровне изоляции транзакций. По большому счету этот параметр вам настраивать вряд ли придется. Дело в том, что у каждой БД свои поддерживаемые уровни изоляций, например, насколько я помню для Oracle - это REPETABLE_READ и SERIALIZABLE, если вы ничего специально не укажете хибернейту - он будет использовать дефолтный от БД. Следует сказать, что не все БД поддерживают все уровни изоляций, а что еще интереснее некоторые могут добавлять свои, так что этот параметр очень сильно зависит от используемой БД. На практике стараются использовать наименьший возможный уровень изоляции транзакций, который позволяет достичь целостности данных, в большинстве случаев это REPETABLE_READ и READ_COMMITTED.
Теоретически в хибернейт можно настроить через hibernate.connection.isolation в hibernate.cfg, но это не рекомендуемая практика. В моей практике случаев когда нужно было поменять дефолтный уровень на какой-то другой были единицы, и то это решалось в большинстве своем другими способами, чем изменение уровня изоляции. Теоретически вы можете сделать два пула для datasource с разными уровнями изоляций и в зависимости от задачи получить датасорс то из одного пула то из другого.

автора есть ли способ программно смоделировать одновременные транзакции чтобы что увидеть проблемы возникающие при разных уровнях изоляции?
Опять повторю, уровень изоляции - это конфигурационный параметр для каждого датасорса, теоретически вы можете настроить датасорс и так и так, и произвести SQL-запросы, но для этого надо читать мануалы по БД и JDBC
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37697415
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ваши ответы. Они мне оказали большую помощь в понимании этого вопроса.
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37697422
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прослушал лекцию про транзакции и JPA ( http://www.youtube.com/watch?v=4PKZRQAtf38&list=UUdXqgQdGW5go6nkkBbUVSMA&feature=plcp
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37697424
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чушь какая-то, точнее может оно то так и есть(про инкремент версии), но смешивание типов блокировок просто не имеет смысла
...
Рейтинг: 0 / 0
уровень изоляции транзакций и Hibernate
    #37873880
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только нет ответа на вопрос :
>> Я более менее понял по отдельности каждую из этих 3 разделов, но не понимаю, как они связаны между собой

Т.е. какая связь на низком уровне между JPA Lock.READ / Lock.WRITE и уровнем изоляции транзакции?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / уровень изоляции транзакций и Hibernate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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