Как отключить систему блокировки JPA?

Я использую OpenJPA, и у меня проблема с блокировкой. Я уже понимаю, что такое OptimisticLockException и когда оно возникает.

Но как я могу справиться с этим?

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

В двух словах, как я могу полностью отключить диспетчер блокировки?

В моем файле persist.xml у меня есть следующий код xml, но он не работает. Почему ?

...
<properties>
  <property name="openjpa.LockManager" value="none" />
</properties>
...

*Согласно викиучебникам о Java Persistent:

Обработка исключений оптимистичных блокировок

К сожалению, программисты часто могут быть слишком умными во вред себе. Первая проблема, возникающая при использовании оптимистической блокировки, заключается в том, что делать, когда возникает исключение OptimisticLockException. Типичный ответ дружелюбного соседского супер-программиста — автоматическая обработка исключения. Они просто создадут новую транзакцию, обновят объект, чтобы сбросить его версию, объединят данные обратно в объект и повторно зафиксируют его. Престо проблема решена или нет?

Это на самом деле лишает смысла блокировку. Если это то, что вы хотите, вы также можете не использовать блокировку. К сожалению, исключение OptimisticLockException редко должно обрабатываться автоматически, и вам действительно нужно беспокоить пользователя по поводу этой проблемы. Вы должны сообщить о конфликте пользователю и либо сказать: «Извините, но произошел конфликт редактирования, и им придется переделать свою работу», либо, в лучшем случае, обновить объект и представить пользователю текущие данные и данные, которые они представили, и помочь им объединить их, если это необходимо.

Некоторые инструменты автоматического слияния сравнивают две конфликтующие версии данных, и если ни одно из отдельных полей не конфликтует, данные просто автоматически объединяются без помощи пользователя. Это то, что делает большинство систем контроля версий программного обеспечения. К сожалению, пользователь, как правило, лучше может решить, когда что-то является конфликтом, чем программа, только потому, что две версии файла .java не изменили одну и ту же строку кода, не означает, что конфликта не было, первый пользователь мог удалить метод, на который другой пользователь добавил метод для ссылки, и несколько других возможных проблем, из-за которых обычно ночная сборка время от времени ломается.


person Sandro Munda    schedule 26.08.2011    source источник
comment
В статье точно объясняется, что в большинстве случаев хороший способ обработки этого исключения — просто сообщить о нем пользователю. Если вы хотите отключить оптимистическую блокировку, почему вы включаете ее, имея в первую очередь поля версии в своих сущностях. Просто не ставьте поле версии, и не будет никакой оптимистичной блокировки.   -  person JB Nizet    schedule 26.08.2011
comment
Да, но проблема в том, что я не хочу сообщать пользователю, эй, чувак, там блокировка! Пользователя не волнует эта ошибка. Итак, как лучше всего справиться с блокировкой? Я действительно не понимаю, что я должен делать.   -  person Sandro Munda    schedule 26.08.2011
comment
Будет ли проблемой, если два пользователя изменят сущность одновременно, и победит последняя модификация, какой бы ни была модификация? Если это проблема, используйте оптимистическую блокировку и сообщайте пользователю, когда возникает проблема. Нет никакого способа обойти это. Если это не проблема, не используйте оптимистическую блокировку. Последняя модификация, если она не нарушает ограничений в вашей базе данных, всегда будет побеждать. Но если одновременно работающие пользователи изменяют одни и те же данные, всегда будут возникать исключения (например, потому что какой-то пользователь может удалить объект до того, как другой пользователь внесет изменения в тот же объект).   -  person JB Nizet    schedule 26.08.2011
comment
@ Сандро Мунда. Если это просто отчет, зачем вообще нужна транзакция? Кроме того, OptimisticLockException, я полагаю, происходит при обновлении. И вот еще вопрос, а зачем вам обновление для отчета?   -  person Stas    schedule 26.08.2011


Ответы (1)


Но как я могу справиться с этим?

Это зависит от вашего приложения... вам нужно делать то, что имеет смысл. Возможно, вам нужно сообщить пользователю, что данные были одновременно изменены, а затем повторно отправить его с новыми данными?

Хотя я не думаю, что отключение OptimisticLocking является правильным решением, я думаю, что установка этих двух свойств избавит вас от OLE, которые вы видите.

<properties>
  <property name="openjpa.Optimistic" value="false"/>
  <property name="openjpa.LockManager" value="none"/>
</properties>
person Rick    schedule 06.09.2011