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
    }
4

1 に答える 1

0

2 つの別々の要求がupdateData()同時にアクセスすると、古いデータが取得される可能性があります。取得したデータを でロックすることにより、古さを処理できますupdateData()。Hibernate を JPA プロバイダーとして使用している場合は、次のようにデータをロックできます。

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

データのフェッチとロックの間に別のトランザクションが完了する可能性があるため、更新が必要ですupdateData

とで使用されるエンティティ マネージャは同じgetDataupdateDataなければならないことに注意してください。

于 2010-10-21T14:19:33.770 に答える