Параллельные обновления одной и той же сущности

1

Господа/дамы,

У меня проблема с параллельными обновлениями одного и того же объекта.

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

Процесс 2 получает объект, похожий на один из тех, что находятся в коллекции (в основном одна и та же строка в БД) и как-то обновляет его. Этот процесс использует Hibernate.

Поскольку процесс 1 и процесс 2 не знают друг о друге, они могут обновлять один и тот же объект, оставив его в несогласованном состоянии.

Например:

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

Мне нужно иметь дело с этой ситуацией.

Итак, что может быть сделано?

Сейчас я вижу два пути:

  1. создать слой над базой данных, который будет отслеживать каждый объект в системе, фактически запрещающий создавать несколько экземпляров одного и того же объекта
  2. настройте оптимистичные блокировки, и поскольку некоторые объекты не получены в Hibernate, мне нужно реализовать его как-то иначе

Любые идеи были бы очень полезны

заранее спасибо

Теги:
multithreading
hibernate
jpa

1 ответ

4
Лучший ответ

Поскольку процесс 1 и процесс 2 не знают друг о друге, они могут обновлять один и тот же объект, оставив его в несогласованном состоянии.

Я бы переформулировал это: оба процесса могут обновлять одни и те же данные. Только Hibernate будет знать объекты, в то время как другой процесс, похоже, получает доступ к данным через JDBC.

Я бы выбрал вариант 2, который будет включать столбец версии в ваших сущностях. После этого IIIB Hibernate добавит условие WHERE version = x к запросам и проверит, были ли обновлены все строки, и если бы не было OptimistictLockException. Вы можете сделать то же самое в своих JDBC-запросах, то есть UPDATE... SET... version = x + 1... WHERE version = x AND additionalConditions и проверить количество строк обновлений, возвращаемых JDBC.

  • 0
    спасибо за ответ, я пойду с этим

Ещё вопросы

Сообщество Overcoder
Наверх
Меню