2011-01-08 13 views
0

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

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 
} 
+0

このOpenJPAまたはHibernateはありますか? – Rick

答えて

0

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

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

0

EM2のレコードがEM1に関係するテーブルと関係があるかどうかは、あなたの質問からはっきりしない。もしそうなら、それはEM2が閉じられなかったためかもしれない。 「選択」イベントでさえ、トランザクションを伴うことに注意してください。したがって、まず、EM2に明示的なトランザクション境界設定を追加することです。暗黙的なトランザクションは本当に良いことではなく、使用しているデータベースと分離レベルによっては、基になるデータベースがEM2の暗黙のトランザクションが終了するのを待っている可能性があり、コードにデッドロックが発生します。

私の提案:良いプラクティスとして

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

、常に明示的にも、読書の目的のために、トランザクションを開始し、コミットしてみてください。トランザクションを指定しなくても、データベースが暗黙的に開始されます。

関連する問題