Как бороться с замками (JPA)? - PullRequest
8 голосов
/ 26 августа 2011

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

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

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

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

*

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

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

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

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

1 Ответ

10 голосов
/ 26 августа 2011

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

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

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

Повтор не возможен:

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

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

...