JPA синхронизирующие средства доступа к объектам

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

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

Я могу быть не прав. Таким образом, вопрос заключается в следующем: есть ли способ "заблокировать" доступ к части объекта или ко всему самому объекту на время начальных вычислений контрольной суммы?

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

2 ответа

Решение

Я могу быть не прав. Таким образом, вопрос заключается в следующем: есть ли способ "заблокировать" доступ к части объекта или ко всему самому объекту на время начальных вычислений контрольной суммы?

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

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

Рекомендации

  • Спецификация JPA 2.0
    • Раздел 3.4.4 "Режимы блокировки"

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

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

Другие вопросы по тегам