Возможные исключения гибернации, когда два потока обновляют один и тот же объект?

Может ли кто-нибудь помочь мне с возможными исключениями гибернации, когда два потока обновляют один и тот же объект?

Например: сотрудник с именем "a", возрастом "30" и адресом "test" thread1 пытается обновить "a" до "b", а thread2 пытается обновить "a" до "c"

Заранее спасибо, Катир

2 ответа

Решение

Спасибо за ответы и ниже комментарии после наблюдения и анализа

  1. Мы также можем выполнить условное обновление с предложением where в запросе и использовать метод executeUpdate (). Пример: метод Hibernate - Query - executeUpdate() обновляет и возвращает количество обновленных сущностей. Таким образом, если executeUpdate () возвращает "ноль", это означает, что строка уже была обновлена ​​другим потоком. (Без исключения)

  2. Использование @Version. (OptimisticLockException)

  3. Использование блокировки БД на уровне строк. (Исключение БД)

  4. Использование синхронизации. (Исключение синхронизации Java)

Если ваш объект является объектом Hibernate, то два потока не должны иметь ссылку на один и тот же объект.

Каждый поток будет иметь свой собственный сеанс Hibernate, а каждый сеанс будет иметь свою собственную копию объекта. Если у вас есть поле с пометкой @Version в вашей сущности для оптимистической блокировки один из потоков получит исключение OptimisticLockException. В противном случае все будет хорошо, и последний поток, который передаст, победит.

Другие вопросы по тегам