2015-12-23 3 views
2

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

JPA обеспечивает автоматическую поддержку ряд версий через @version annotation.When у вас есть объект с @version annotatted поля или свойства, оптимистичная блокировка будет включена автоматически ,

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

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

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

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

ответ

2

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

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

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

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

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

1

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

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

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

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

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

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

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

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

+0

tharindu_DG в моем случае Я использую базу данных mysql, уровень изоляции по умолчанию которой повторяется. Таким образом, наряду с повторяющимся чтением уровня изоляции, я могу использовать оптимистичную блокировку или пессимистичную блокировку на основе моего требования, правильно? –

+0

'repeatable reads' - это более высокий уровень изоляции, который' read commit', потому что он не только блокирует запись, но и читает, чтобы избежать проблемы с неповторяющимися чтениями. Во всяком случае, я думаю, он совместим с оптимистичной блокировкой. – malaguna

Смежные вопросы