0

我有一个实体管理器 em1 .em1 在 db1 table1 上启动一个事务 tx。现在在 tx 内我调用一个 API getdata()。这个 API 创建一个新的实体管理器 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
}
4

2 回答 2

0

从您的问题中不清楚 EM2 的记录是否与 EM1 中涉及的表有任何关系。如果是这样,那可能是因为 EM2 没有关闭。请注意,即使“选择”事件也涉及事务。所以,我想说第一件事是在 EM2 中添加明确的事务划分。隐式事务并不是什么好事,根据您使用的数据库和隔离级别,底层数据库可能正在等待 EM2 的隐式事务完成,从而导致您的代码出现死锁。

我的建议:

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

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

于 2011-01-08T14:46:43.667 回答
0

不要创建 em2。将 em1 作为参数传递给getData()方法。这样做,您只操作了一个 em1。

具体我不知道,但是好像em1在相关表上加了锁,所以外面什么也做不了。

于 2011-01-08T14:46:52.250 回答