JPA синхронизирующие средства доступа к объектам - PullRequest
3 голосов
/ 24 сентября 2010

Вот настройка: у класса сущностей есть коллекция других сущностей, которые загружаются лениво.Хитрость в том, что мне нужно выполнить некоторую работу с данными (например, я хочу вычислить определенную контрольную сумму с элементами сбора).

Хитрость заключается в том, что я хочу любой ценой избежать условий гонки, таких как: «кто-то обновил сущность, пока я выполнял вычисления данных».В обычных обстоятельствах я просто объявлю синхронизацию getter / setter и буду доволен этим.НО, насколько я понимаю, если другой поток решит обновить состояние объекта из базы данных, в то время как я нахожусь в процессе вычисления моей контрольной суммы, он будет полностью игнорировать «синхронизированные» методы (он получит прямой доступ к полю).

Возможно, я ошибаюсь.Таким образом, вопрос заключается в следующем: есть ли способ «заблокировать» доступ к части сущности или ко всей сущности на время начальных вычислений контрольной суммы?

Заранее спасибо!PS Если вам нужен фрагмент кода для иллюстрации проблемы - просто дайте мне знать.Пока я думаю, что вопрос довольно ясен.

Ответы [ 2 ]

4 голосов
/ 24 сентября 2010

Я могу ошибаться. Поэтому возникает вопрос: есть ли способ «заблокировать» доступ к части сущности или ко всей сущности на время начальных вычислений контрольной суммы?

JPA 2.0 поддерживает пессимистический параллелизм , и вы можете прочитать сущность и заблокировать соответствующую строку на уровне базы данных (обратите внимание, что упомянутая ссылка предшествует окончательной версии спецификации JPA 2.0 и не отражает все возможные значения перечисления LockMode, но вы поняли).

И если вы используете JPA 1.0, боюсь, вам придется использовать собственный SQL для выполнения эквивалента SELECT ... FOR UPDATE.

Ссылки

  • спецификация JPA 2.0
    • Раздел 3.4.4 «Режимы блокировки»
1 голос
/ 21 сентября 2011

Вы также можете использовать @Version для атрибута вашей сущности (работает в JPA 1.0)

http://java.dzone.com/articles/jpa-20-concurrency-and-locking

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