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

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

пример: сотрудник с именем «a», возрастом «30» и адресом «test» поток 1 пытается обновить «a» до «b», а поток 2 пытается обновить «a» до «c»

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


person Kathir    schedule 14.11.2012    source источник
comment
В моем случае thread1 обновляет a до b, а thread2 обновляет 30 до 35, но оба пишут в одну и ту же строку, и я получаю тупик. Любая помощь по этому поводу?   -  person Jerry    schedule 12.01.2018


Ответы (2)


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

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

person JB Nizet    schedule 14.11.2012

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

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

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

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

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

person Kathir    schedule 15.11.2012
comment
Можете ли вы помочь понять пункт 4, что такое исключение синхронизации? - person Gaurava Agarwal; 11.07.2016