2015-09-21 4 views
0

Env:Блокировка для JPA лиц без @version

Java EE 7 
JPA 2.1 
EJB 3.1 
Hibernate 4 

Недавно мы испытывающие проблемы с данными в одном из таблицы. Пара точек

  1. В таблице отображается JPA сущности
  2. таблицы, а также Entity не имеет столбец «версия»/атрибут.

Другими словами, для этой таблицы не существует оптимистической блокировки. При выполнении RCA это оказалось проблемой одновременного изменения данных.

Вопросы:

  1. В таких случаях, когда @version не доступен б/у (другими словами Оптимистическая блокировка), использует одноэлементный класс хранилище является единственным вариантом, чтобы убедиться, что данные консистенция сохраняется?

  2. Как насчет пессимистической блокировки в таких случаях?

  3. Я считаю, что его общий прецедент, когда приложение (особенно наследие) может иметь несколько таблиц с колонкой версий, а некоторые - нет. Существуют ли какие-либо известные шаблоны для обработки таблиц/объектов без столбца версии?

Спасибо заранее, Ракеш

ответ

1

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

Короче говоря, EntityManager предоставляет lock метод для блокировки уже извлекаться объект, а также перегружен em.find и em.merge, а также Query.setLockMode обеспечивает средство для подачи заблокированных применять блокировку атомарна в то время, когда данные извлекаются из БДА.

Однако, с пессимистичной блокировкой, вы должны знать, что следует избегать взаимоблокировок. Лучший способ решить эту проблему - всегда блокировать не более одного объекта за транзакцию.

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

Более подробное объяснение оптимистической и пессимистической блокировки с JPA предоставляется here, включая различия между режимами блокировки READ и WRITE и таймаутом блокировки блокировки.

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