删除记录时出现问题

时间:2011-01-08 14:27:58

标签: java hibernate jpa openjpa

我有一个实体管理器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
}

2 个答案:

答案 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正在锁定相关的表格,所以你不能在外面做任何事情。