Похоже, вам будет интересно оптимистическое управление параллелизмом с использованием управления версиями.
Оптимистическое управление параллелизмом
Если вы еще не сталкивались с этим, то аналогичную идею сравнитьand-swap, посредством которого Hibernate будет управлять версией вместе с сущностью.Увеличивая номер версии во время обновлений и проверяя, не изменился ли он после, Hibernate может обнаруживать конфликты и ошибки.Он оптимистично предполагает, что фактическая конкуренция встречается редко, и оставляет за разработчиком возможность обрабатывать исключения.Обычно я обнаружил, что это так, и, как говорят документы Hibernate,
Единственный подход, который согласуется с высоким параллелизмом и высокой масштабируемостью, - это оптимистичное управление параллелизмом с контролем версий.
Вы можете настроить видимость транзакций и уровень изоляции Hibernate, чтобы повлиять на более мелкие детали, см.
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-optimistic
Разграничение транзакций
Я не могу сказатьиз фрагмента кода вопроса, но это также может стоить рассмотреть границы транзакции.Обычно я начинаю транзакцию (beginTransaction
) в начале бизнес-операции или запроса, а также фиксирую и завершаю.Все обновления выполняются в этой модели сеанса (с одним Hibernate для одного потока на сеанс).Я все еще обрабатываю каждую бизнес-операцию или запрос в своем собственном потоке и полагаюсь на обычные уровни изоляции Hiernate и т. Д. Для управления конфликтами.
Я упоминаю об этом, потому что может быть шанс сделать шаг назад и подумать, почему вы делаете обновления изнесколько потоков.Может случиться так, что ваше приложение не соответствует подходу, который я попытался изложить, но, возможно, стоит подумать, можно ли его перенести, чтобы избежать подлинных многопоточных обновлений.
Если это не так, то, безусловно, стоит понять, возможны ли частые конфликты на производстве.Тестирование этого может помочь вам понять, действительно ли вам нужно беспокоиться об этом или вы можете полагаться на обычно управление транзакциями для обнаружения конфликтов и их обработки другими способами.