Как быть с блокировками (JPA)?

Согласно викикнигам Java Persistent/Locking*, лучший способ справиться с с блокировками — сообщить пользователю об ошибке/исключении Optimistic Lock Error/Exception.

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

В двух словах :

  • Лучший способ - отключить все блокировки?
  • Лучший способ сообщить пользователю сообщение об ошибке блокировки? Но пользователь должен повторить свое действие, пока оно не сработает!
  • Лучший способ - повторить транзакцию, пока не будет блокировки?

*

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

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

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

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


person Sandro Munda    schedule 26.08.2011    source источник
comment
возможный дубликат Как отключить систему блокировки JPA? , от того же автора.   -  person JB Nizet    schedule 26.08.2011
comment
Я бы сказал, что они не дублируются, потому что один спрашивает, как отключить, а другой спрашивает стратегию с блокировками.   -  person Mr.Eddart    schedule 26.08.2011


Ответы (1)


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

Будет ли проблемой, если два пользователя изменят объект одновременно, и если последняя модификация окажется выигрышной, какой бы ни была модификация? Если это проблема, используйте оптимистическую блокировку и сообщайте пользователю, когда возникает проблема. Нет никакого способа обойти это.

Если это не проблема, не используйте оптимистическую блокировку. Последняя модификация, если она не нарушает ограничений в вашей базе данных, всегда будет побеждать. Но если пользователи одновременно изменяют одни и те же данные, это всегда приведет к исключениям (например, потому что какой-то пользователь может удалить объект до того, как другой пользователь отправит изменение в тот же объект).

Повторная попытка не вариант:

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

Вашу проблему можно объяснить аналогией с автомобилем. Предположим, вы решили купить автомобиль с ограничителем скорости, чтобы убедиться, что вы не нарушаете ограничение скорости. А теперь вы спросите: а мне плевать на ограничения скорости. Разве я не должен всегда отключать ограничитель скорости? Можно, но не удивляйтесь, если вас поймает полиция.

person JB Nizet    schedule 26.08.2011
comment
Спасибо за отличное объяснение - person Sandro Munda; 26.08.2011