0

私はエンティティマネージャーem1を持っています。em1はdb1 table1でトランザクションtxを開始します。tx内でAPI getdata()を呼び出します。このAPIは新しいエンティティマネージャーem2を作成し、1つのレコードを返します。エンティティマネージャーem1が返されたレコードを削除しようとするとem1 によって、ハングします。コードがタイムアウトします。レコードは em1 によってロックされています。この問題をどのように解決できますか?

create em1
//em1 start transcation tx1
tx1.start
Object r = getData();
em1 tried to delete r //code hangs here
tx1.commit


Object getData(){
create em2
return data found using em2
}
4

2 に答える 2

0

EM2 のレコードが EM1 に含まれるテーブルと関係があるかどうかは、あなたの質問からは明らかではありません。その場合、EM2 が閉じられていないことが原因である可能性があります。「選択」イベントにもトランザクションが含まれることに注意してください。したがって、最初に行うことは、EM2 で明示的なトランザクション境界を追加することです。暗黙的なトランザクションは実際には良いことではありません。使用しているデータベースと分離レベルによっては、基盤となるデータベースが EM2 の暗黙的なトランザクションが完了するのを待っている可能性があり、コードでデッド ロックが発生します。

私のおすすめ:

Object getData(){
  create em2
  tx2.start
  get record 
  tx2.commit
  close em2
  return record
}

読み取り目的であっても、トランザクションを常に明示的に開始してコミットすることをお勧めします。トランザクションを指定しなくても、データベース暗黙的にトランザクションを開始することに注意してください。

于 2011-01-08T14:46:43.667 に答える
0

em2 を作成しないでください。em1 をパラメーターとしてgetData()メソッドに渡します。そうすることで、em1 を 1 つしか操作していません。

正確にはわかりませんが、em1が関連テーブルにロックをかけているようで、外では何もできません。

于 2011-01-08T14:46:52.250 に答える