Синхронизация весенней транзакции - PullRequest
1 голос
/ 18 августа 2011

Мы используем Spring и Hibernate в нашем проекте и имеем многоуровневую архитектуру. Контроллер -> Сервис -> Менеджер -> Дао. Транзакции начинаются на уровне менеджера. Метод на уровне сервиса, который обновляет объект в БД, вызывается многими потоками, и это вызывает исключение устаревшего объекта. Поэтому я сделал этот метод синхронизированным и все еще вижу исключение устаревшего объекта. Что я здесь не так делаю? Есть ли лучший способ справиться с этим делом?

Заранее спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Исключение устаревшего объекта выдается, когда объект был изменен между временем, когда он был прочитан, и временем, когда он обновлен. Это может происходить внутри одной транзакции, но также может происходить, когда вы читаете объект в транзакции, изменяете его (например, на уровне контроллера), затем запускаете другую транзакцию и объединяете / обновляете ее (в этом случае, минуты или часы). можно разделить чтение и обновление).

Исключение выдается, чтобы помочь вам избежать конфликтов между пользователями.

Если вас не волнуют конфликты (т. Е. Последнее обновление всегда побеждает и заменяет написанное предыдущими), не используйте оптимистическую блокировку. Если вас беспокоят конфликты, то возникнут исключения StaleObjectExceptions, и вы должны высказать значимое сообщение конечному пользователю, попросив его перезагрузить данные и попытаться изменить их снова. Нет способа избежать их. Вы просто должны быть оптимистами и надеяться, что они не будут происходить часто.

Обратите внимание, что ваш синхронизированный трюк будет работать, только если

  • исключение происходит только при чтении и записи в одной транзакции
  • Обновления сущности выполняются только этой службой
  • ваше приложение не кластеризовано.

Это также может значительно снизить пропускную способность, поскольку вы запрещаете любые одновременные обновления, независимо от того, какие объекты обновляются параллельными транзакциями. Это как если бы вы заблокировали всю таблицу на время всей транзакции.

1 голос
/ 18 августа 2011

Полагаю, вам нужно настроить оптимистическую блокировку на стороне Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...