2010-06-30 52 views
1

我有使用Java EE Bean管理事务的旧系统的情况。当它试图检索刚刚创建的东西时,它会抛出LockAcquisitionException在Java EE中重新运行容器管理的事务失败

我最初的想法是这样的:

@TransactionAttribute(SUPPORTS) 
public Item retrieveItem(int id) { 
Item i; 
try { 
    i = em.find(Item.class, id); 
} catch (PersistenceException e) { 
    if (e.getCause() instanceof LockAcquisitionException) { 
    i = retrieveItem(id); 
    } 
} 
return i; 
} 

但是 - 递归调用时,该交易已经死了 - 它似乎并没有创建一个新的。我试过不同的TransactionAttributes,但它似乎没有什么区别。也尝试自己管理交易(em.getTransaction()),但这在CMT中是非法的。

我不是在寻找一个优雅的修正 - 正如我所说,这是传统的,我只是需要的东西,将它类选,直到整个事情得到在一两个月的更换!

干杯。

回答

0

不幸的是,我可以找到这样做的唯一方法是修复交易的原因 - 所以现在我在retrieveItem()开头做了em.flush()。等不及要取代这个程序..

1

尝试使用@TransactionAttribute(REQUIRES_NEW)注释retrieveItem:它将在新事务中执行。

需要注意的是:

  1. 第二交易期间,第一个是已经无效(回滚套),绝不会完全
  2. ,在第一个事务造成的变化是不可见反正

所以我不知道它是否适合你的情况。但是,如果原始交易已失效,这是我知道进行操作并成功提交的唯一方法。

+0

谢谢..试过了,但它仍然是不工作...我不能完全肯定它拿起注解,因为我得到一个“交易不活跃”的错误。 :( – 2010-07-01 08:53:24

+0

@Robert威尔逊我的错误,我忽略了你使用BMT的事实。你可以尝试注入'UserTransaction',并用它来启动/停止一个新的,而不是'em.getTransaction'? – ewernli 2010-07-01 12:46:23