Как происходит автоматическая блокировка объекта с аннотированным полем или свойством @Version?

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

JPA обеспечивает автоматическую поддержку управления версиями строк с помощью аннотации @Version. Если у вас есть объект с аннотированным полем или свойством @Version, оптимистическая блокировка будет включена автоматически.

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

  1. Чтение без фиксации: реализовано с исключительной блокировкой записи
  2. Фиксация чтения: реализована с использованием разделяемых блокировок чтения и исключительных блокировок записи.

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

Мой вопрос: когда поле объявляется как @Version с аннотациями, переопределяет ли оно базовый уровень изоляции по умолчанию и имеет место оптимистическая блокировка?


person Bhupati Patel    schedule 23.12.2015    source источник


Ответы (2)


Нет, это разные вещи. По умолчанию уровень изоляции настроен на read-commited, поэтому никакие изменения не могут быть прочитаны до фиксации транзакции.

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

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

Оптимистическая блокировка контролируется инфраструктурой ORM, которая заботится о правильной версии номера объекта при сохранении. Итак, это разные вещи.

Надеюсь, поможет!

person malaguna    schedule 23.12.2015

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

Если бы вы каким-то образом смогли это сделать, а это было бы бесполезно.

В большинстве баз данных по умолчанию используется уровень изоляции READ_COMMITED.

Рассмотрим следующий сценарий на уровне изоляции READ_COMMITED.

  • Два менеджера загружают Product объект
  • Оба они решают поднять цену, а затем сохранить ее.
  • Одно обновление цен фиксируется раньше другого.
  • Таким образом, цена одного менеджера будет заменена ценой другого менеджера, и наши менеджеры об этом не узнают.

Хотя этот сценарий тривиален, подобные вещи могут происходить в нетривиальных сценариях.

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

Надеюсь это поможет.

person tharindu_DG    schedule 23.12.2015
comment
tharindu_DG в моем случае я использую базу данных mysql, уровень изоляции которой по умолчанию является повторяемым чтением. Итак, наряду с повторяемым чтением уровня изоляции я могу использовать оптимистическую блокировку или пессимистическую блокировку в зависимости от моих требований, верно? - person Bhupati Patel; 23.12.2015
comment
repeatable reads - это более высокий уровень изоляции, чем read committed, потому что он блокирует не только запись, но и чтение, чтобы избежать non-repeatable reads проблемы. Во всяком случае, я думаю, он совместим с оптимистической блокировкой. - person malaguna; 24.12.2015