我有一个实体管理器em1 .em1在db1 table1.now上启动一个transcation tx在tx里面调用一个API getdata()。这个API创建一个新的entitymanger 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
}
答案 0 :(得分:0)
从您的问题中不清楚EM2的记录是否与EM1中涉及的表格有关。如果是这样,那么可能是因为EM2没有关闭。请注意,即使“选择”事件也涉及交易。所以,我想说第一件事就是在EM2中添加显式事务划分。隐式事务并不是一件好事,并且根据您使用的数据库和隔离级别,底层数据库可能正在等待EM2的隐式事务完成,从而导致代码死锁。
我的建议:
Object getData(){
create em2
tx2.start
get record
tx2.commit
close em2
return record
}
作为一种好的做法,尽量明确地开始并提交交易,即使是为了阅读目的。请记住,即使您没有指定事务,您的数据库也将隐式启动。
答案 1 :(得分:0)
不要创建em2。将em1作为参数传递给getData()
方法。这样做,你只运行一个em1。
我不确切知道,但似乎em1正在锁定相关的表格,所以你不能在外面做任何事情。