【问题标题】:Concurrency issue in JPA and JTA [duplicate]JPA和JTA中的并发问题[重复]
【发布时间】:2010-10-21 14:04:38
【问题描述】:

可能重复:
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
    }

【问题讨论】:

  • 同一对象上的两个不同 EM 可能不是一个好主意。
  • 如果您没有得到满意的答案,请让人们知道他们不满意的原因并澄清您的问题。发布相同的问题无济于事,继续努力。投票结束。
  • 是的,请只编辑原始问题,而不是发布重复的问题。编辑会将其撞回“活动”页面的顶部,因此会获得更多浏览量。

标签: java orm jpa jta


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多