Возможные исключения гибернации, когда два потока обновляют один и тот же объект?
Может ли кто-нибудь помочь мне с возможными исключениями гибернации, когда два потока обновляют один и тот же объект?
Например: сотрудник с именем "a", возрастом "30" и адресом "test" thread1 пытается обновить "a" до "b", а thread2 пытается обновить "a" до "c"
Заранее спасибо, Катир
2 ответа
Спасибо за ответы и ниже комментарии после наблюдения и анализа
Мы также можем выполнить условное обновление с предложением where в запросе и использовать метод executeUpdate (). Пример: метод Hibernate - Query - executeUpdate() обновляет и возвращает количество обновленных сущностей. Таким образом, если executeUpdate () возвращает "ноль", это означает, что строка уже была обновлена другим потоком. (Без исключения)
Использование @Version. (OptimisticLockException)
Использование блокировки БД на уровне строк. (Исключение БД)
Использование синхронизации. (Исключение синхронизации Java)
Если ваш объект является объектом Hibernate, то два потока не должны иметь ссылку на один и тот же объект.
Каждый поток будет иметь свой собственный сеанс Hibernate, а каждый сеанс будет иметь свою собственную копию объекта. Если у вас есть поле с пометкой @Version
в вашей сущности для оптимистической блокировки один из потоков получит исключение OptimisticLockException. В противном случае все будет хорошо, и последний поток, который передаст, победит.