JPA和JTA中的并发问题

时间:2010-10-21 14:04:38

标签: java orm jpa jta

  

可能重复:
  concurrency (stale data) problem in JPA

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

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
    }

1 个答案:

答案 0 :(得分:0)

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

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

刷新是必要的,因为在updateData中另一个事务完成的提取和锁定数据之间可能会发生。

请注意,getDataupdateData中使用的实体经理必须相同。