проблема параллелизма (устаревших данных) в JPA - PullRequest
3 голосов
/ 20 октября 2010

Допустим, у меня есть методы со следующей подписью

Object getData(int id) {  
  //create a entity manager
  //get data frm db
  //return data
}

updateData() {
  Object obj = getData(id) 
  //get entity manager
  //start transcation tx
  //update
  //commit tx
}

Теперь это вызовет проблему параллелизма? Могут ли данные быть устаревшими в худшем случае? Например. если я getData и к тому времени, когда я обновлю, если кто-то обновит данные, мои updateData будут иметь устаревшие данные? Теперь я могу использовать следующее: Решу ли я проблему?

Object getData(int id,Entitymanager em) {  

      //get data frm db using em
      //return data
    }

 updateData() {
      Object obj = getData(id) 
      //get entity manager em
      //start transcation tx
      //getdata using getData(id,em)
      //commit tx
    }

Ответы [ 3 ]

6 голосов
/ 20 октября 2010

Да, это может произойти.

Если вы получаете объект (версия 1), кто-то другой изменяет его (создает версию 2), затем вы изменяете версию 1 и сохраняете ее, любые изменения в версии 2быть потерянным.

Чтобы этого не случилось, используйте оптимистичный параллелизм, добавив атрибут @Version к вашей сущности.Если между получением и обновлением произошла фиксация, будет выдано исключение.На данный момент вы можете выбрать лучший вариант для борьбы с ним.

1 голос
/ 22 октября 2010

Если два отдельных запроса обращаются к updateData() одновременно, вы можете получить устаревшие данные. Вы можете справиться с устареванием, заблокировав извлеченные данные в updateData(). Если вы используете Hibernate в качестве поставщика JPA, вы можете заблокировать данные следующим образом:

updateData() {
    Object obj = getData(id);
    Session session = (Session) em.getDelegate();
    session.refresh(obj, LockMode.UPGRADE);
}

Обновление необходимо, потому что может случиться так, что между извлечением и блокировкой данных другая транзакция завершится в updateData.

Имейте в виду, что менеджер сущностей, используемый в getData и updateData, должен совпадать.

1 голос
/ 20 октября 2010

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

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm

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