Hibernate использует результат PreparedStatement # executeUpdate для проверки количества обновленных строк. Если ни одна строка не была сопоставлена, она выдает StaleObjectStateException (при использовании Hibernate API) или OptimisticLockException (при использовании JPA).
Optimistic locking - это универсальная технология управления параллелизмом, и она работает как для физических, так и для application-level transactions.
Таким образом, устаревшие исключения предотвращают явления «потерянного обновления», когда несколько одновременных запросов изменяют одни и те же общие постоянные данные.
В транзакции на уровне приложения после загрузки объекта вы получите логическое повторяемое чтение из-за кеша 1-го уровня (контекст сохранения), но другие пользователи могут все еще модифицировать вышеупомянутый объект.
Таким образом, вы действительно можете столкнуться с устаревшими объектами, но оптимистический механизм блокировки предотвращает потерю обновлений без каких-либо дополнительных блокировок базы данных и даже работает для длительных разговоров.
Я проверил кеш, и он использует @Cache (использование = CacheConcurrencyStrategy.READ_WRITE) –