Согласно викикнигам Java Persistent/Locking*, лучший способ справиться с с блокировками — сообщить пользователю об ошибке/исключении Optimistic Lock Error/Exception.
Проблема в том, что он не масштабируется. Предположим, что у меня есть много пользователей, которые могут вызвать блокировку одним и тем же действием. Пользователя не волнует сообщение об ошибке блокировки.
В двух словах :
- Лучший способ - отключить все блокировки?
- Лучший способ сообщить пользователю сообщение об ошибке блокировки? Но пользователь должен повторить свое действие, пока оно не сработает!
- Лучший способ - повторить транзакцию, пока не будет блокировки?
*
Обработка исключений оптимистичных блокировок
К сожалению, программисты часто могут быть слишком умными во вред себе. Первая проблема, возникающая при использовании оптимистической блокировки, заключается в том, что делать, когда возникает исключение OptimisticLockException. Типичный ответ дружелюбного соседского супер-программиста — автоматическая обработка исключения. Они просто создадут новую транзакцию, обновят объект, чтобы сбросить его версию, объединят данные обратно в объект и повторно зафиксируют его. Престо проблема решена или нет?
Это на самом деле лишает смысла блокировку. Если это то, что вы хотите, вы можете также не использовать блокировку. К сожалению, исключение OptimisticLockException редко должно обрабатываться автоматически, и вам действительно нужно беспокоить пользователя по поводу этой проблемы. Вы должны сообщить о конфликте пользователю и либо сказать «извините, но произошел конфликт редактирования, и им придется переделать свою работу», либо, в лучшем случае, обновить объект и представить пользователю текущие данные и данные, которые они представили, и помочь им объединить их, если это необходимо.
Некоторые инструменты автоматического слияния сравнивают две конфликтующие версии данных, и если ни одно из отдельных полей не конфликтует, данные просто автоматически объединяются без помощи пользователя. Это то, что делает большинство систем контроля версий программного обеспечения. К сожалению, пользователь, как правило, лучше может решить, когда что-то является конфликтом, чем программа, только потому, что две версии файла .java не изменили одну и ту же строку кода, не означает, что конфликта не было, первый пользователь мог удалить метод, на который другой пользователь добавил метод для ссылки, и несколько других возможных проблем, из-за которых обычно ночная сборка время от времени ломается.