1

我有一个使用 Java EE Bean Managed Transactions 的遗留系统的情况。LockAcquisitionException当它试图检索它刚刚创建的东西时,它会被抛出。

我最初的想法是这样的:

@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 中是非法的。

我不是在寻找一个优雅的解决方案——正如我所说,这是遗留问题,我只需要对它进行分类的东西,直到整个东西在几个月内被替换!

干杯。

4

2 回答 2

1

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

注意:

  1. 第一个已失效(设置为回滚)并且永远不会完成
  2. 在第二个事务期间,第一个事务中所做的更改无论如何都不可见

所以我不知道它是否适合你的场景。但如果原始事务已失效,这是我知道的唯一一种执行操作并成功提交的方法。

于 2010-06-30T18:39:58.737 回答
0

不幸的是,我能找到的唯一方法是修复交易的原因 - 所以现在我em.flush()retrieveItem(). 等不及要更换这个应用程序..

于 2010-07-01T12:31:06.823 回答