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