2011-01-08 130 views
0

我有一個實體管理器em1 .em1在db1 table1.Now裏啓動一個transxation tx我調用一個API getdata()。這個API創建一個新的entitymanger em2並返回1個record.Now如果entity manger 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 
} 
+0

這是OpenJPA還是Hibernate? – Rick 2011-01-08 22:15:10

回答

0

請勿創建em2。將em1作爲參數傳遞給getData()方法。這樣做,你只能操作一個em1。

我不知道確切的,但似乎em1鎖定在相關表上,所以你不能在外面做任何事情。

0

從您的問題來看,EM2的記錄與EM1涉及的表格是否有關係並不明確。如果是這樣,那麼可能是因爲EM2沒有關閉。請注意,即使「選擇」事件涉及交易。所以,我想說的第一件事是在EM2中添加明確的交易分界。隱式事務並不是一件好事,並且根據您使用的數據庫和隔離級別,底層數據庫可能正在等待EM2的隱式事務完成,導致代碼中出現死鎖。

我的建議:

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

作爲一個很好的做法,嘗試總是明確地開始和提交事務,甚至閱讀的目的。請記住,即使您沒有指定交易,您的數據庫隱式啓動一個。