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

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

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

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

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

*

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

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

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

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

8
задан Sandro Munda 26 August 2011 в 09:07
поделиться