2010-10-21 3 views
0

Можно создать дубликат:
concurrency (stale data) problem in JPAПараллелизм вопрос в JPA и JTA

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

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 
} 

Теперь это вызовет параллелизм i ы п? Могут ли данные быть просроченными в худшем случае? Например. если я 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 
    } 
+0

Два разных ЭМ на одном объекте, вероятно, не очень хорошая идея. – Qwerky

+1

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

+0

Да, просто отредактируйте исходный вопрос, а не отправляйте дубликаты. Редактирование вернет его в начало страницы «Актив», чтобы получить больше просмотров. –

ответ

0

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

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

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

Обратите внимание: менеджер объектов, используемый в getData и updateData, должен быть таким же.

Смежные вопросы