2011-01-08 103 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 
} 

作为一个很好的做法,尝试总是明确地开始和提交事务,甚至阅读的目的。请记住,即使您没有指定交易,您的数据库隐式启动一个。