JPA和JTA中的并发问题

发布于 2024-09-29 03:02:05 字数 905 浏览 5 评论 0原文

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

Possible Duplicate:
concurrency (stale data) problem in JPA

Sorry for duplicating, but I think I didn't get satisfactory answers so posting again
Let's say I have methods with following signature

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
}

Now will it cause concurrency issue? Can data be stale in worst case? E.g.
if I getData and by the time I update, if someone updates the data will my updateData will have stale data?
Now can i use following:Will i solve the problem?

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
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

注定孤独终老 2024-10-06 03:02:05

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

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

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

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

If two separate requests access updateData() concurrently you may get stale data. You may handle the staleness by locking the fetched data in updateData(). If you're using Hibernate as your JPA provider you can lock the data as follows:

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

The refresh is necessary because it may happen that between the fetching and the locking of the data another transaction completes in updateData.

Please keep in mind that the entity manager used in getData and updateData must be the same.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文