Java JPA和JTA中的并发问题

Java JPA和JTA中的并发问题,java,orm,jpa,jta,Java,Orm,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 //comm

可能重复:

很抱歉重复,但我想我没有得到满意的答案,所以再次发布 假设我有以下签名的方法

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
    }

如果两个单独的请求同时访问
updateData()
,您可能会得到过时的数据。您可以通过在
updateData()
中锁定获取的数据来处理过时。如果使用Hibernate作为JPA提供程序,则可以按如下方式锁定数据:

updateData() {
    Object obj = getData(id);
    Session session = (Session) em.getDelegate();
    session.refresh(obj, LockMode.UPGRADE);
}
刷新是必要的,因为在获取数据和锁定数据之间,另一个事务可能会在
updateData
中完成


请记住,在
getData
updateData
中使用的实体管理器必须相同。

在同一对象上使用两个不同的EMs可能不是一个好主意。如果您没有得到满意的答案,请让人们知道他们不满意的原因,并可能澄清您的问题。发布同样的问题不会有帮助,继续努力吧。投票结束。是的,请编辑原始问题,而不是发布重复的问题。编辑将使其返回到“活动”页面的顶部,因此它将获得更多的视图。