Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > уровень изоляции транзакций и Hibernate


Автор: rdmrdm 8.3.2012, 22:06
Первый вопрос. Какая связь существует между уровнем изоляции транзакций, параметрами JPA Lock.READ / Lock.WRITE и версиями @Version(Оптимистическая блокировка). Я более менее понял по отдельности каждую из этих 3 разделов, но не понимаю, как они связаны между собой. Выбранный уровень изоляции транзакций дает некие «гарантии» при проведении операций с таблицами. Параметры Lock.READ/Lock.WRITE позволяют добиться блокировки полей таблицы при проведении операций. Если я правильно понял для этого как раз и используются поле @Version. Но все таки не до конца улавливаю связь между эти тремя понятиями. Или они дополняют друг друга, или это разные способы решения одних и тех же проблем. В общем, буду очень благодарен за ответ или же ссылку где можно прочесть информацию именно по вопросы связи между этими понятиями и их совместном использовании.

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

Спасибо.

Автор: Zloxa 13.3.2012, 12:27
Я попытаюсь дать вам ответ вне контекста JPA и хибернейт, ибо, как мне кажется, тут можно подняться на более высокий уровень абстракции. Заранее прошу прощения, если мой ответ окажется не в дугу.

Уровень изоляции транзакций определяет степень согласованности чтений в многопользовательской среде. Дважды запросив одну и ту же ифномрацию, по одним и тем же критериям, можно получить различные результаты, т.к. данные могли быть изменены другой сессией. Степень независимости запрашиваемых данных от модификаций, производимых в параллельных сессиях и определяют уровни изоляции транзакций. Один из способов обеспечения этой изоляции являются блокировки. В этом случае, при самом высоком уровне изоляции(serialized), будучи единожды прочитанными, данные блокируются для модификации другими сессиями, до окончания читающей транзакции.

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

Пытаюсь изобразить на примере:
Пессимистическая стратегия блокирования:
1) открываем транзакцию с высоким уровнем изоляции
2) Читаем исходные данные с блокированием. Теперь ни одна тварь не сможет их изменить.
3) Много тупим
4) Получаем результат
5) Сохраняем результат
6) фиксируем транзакцию, отпускаем блокировки

Оптимистическая стратегия блокирования:
1)  Читаем исходные данные:
  • открываем транзакцию с низким уровнем изоляции
  • читаем исходные данные без блокирования либо же с минимально необходимым
  • закрываем транзакцию
2) много тупим
3) получаем результат
4) сохраняем результат:
  •  открываем транзакцию с высоким уровнем изоляции
  •  повторно читаем исхдоные данные, но уже с блокированием
  •  анализируем, соответствуют ли версия повторно считанных данных исходной версии, если не соответствуют - кричим караул, прекращаем операцию, откатываем транзакцию
  •  сохраняем результат
  •  фиксируем транзакцию, отпускаем блокировки
Получается для реализации стратегии блокирования могут быть использованы различные уровни изоляции, которые, в свою очередь обеспечивают блокирование ресурсов. В то же время ни что вроде как не мешает самостоятельно управлять блокированием ресурсов при реализации этой стратегии

Автор: rdmrdm 13.3.2012, 18:18
Спасибо за ваш ответ. Время от времени мне кажется, что я понимаю эти вещи)
Вообще мне кажется полезным, если бы кто-то из людей с опытом написал пример, в которым были бы продемонстрированы разные варианты, в т.ч. при одновременных транзакциях. Например какое-нибудь приложение GUI с выборов вариантом уровня изоляции, блокировок и просмотром результата работы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)