在Java EE中重新运行失败的容器管理事务

在Java EE中重新运行失败的容器管理事务,java,jboss,transactions,jakarta-ee,jta,Java,Jboss,Transactions,Jakarta Ee,Jta,我有一个使用JavaEEBean管理事务的遗留系统的情况。当它试图检索刚刚创建的东西时,会抛出LockAcquisitionException 我最初的想法是: @TransactionAttribute(SUPPORTS) public Item retrieveItem(int id) { Item i; try { i = em.find(Item.class, id); } catch (PersistenceException e) { if (e.getCause(

我有一个使用JavaEEBean管理事务的遗留系统的情况。当它试图检索刚刚创建的东西时,会抛出
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;
}
但是,当进行递归调用时,事务已经终止,并且似乎没有创建新的事务。我尝试了不同的
事务属性
,但似乎没有什么不同。我也尝试过自己管理事务(
em.getTransaction()
),但这在CMT中是非法的

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


干杯。

尝试使用
@TransactionAttribute(REQUIRES\u NEW)
注释
retrieveItem
:然后它将在新事务中执行

请注意:

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

  • 所以我不知道这是否符合你的设想。但这是我所知道的在原始事务无效时执行操作并成功提交的唯一方法

    尝试使用
    @TransactionAttribute(REQUIRES\u NEW)
    注释
    retrieveItem
    :然后将在新事务中执行它

    请注意:

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

  • 所以我不知道这是否符合你的设想。但这是我所知道的在原始事务无效时执行操作并成功提交的唯一方法

    不幸的是,我能找到的唯一方法是修复事务的原因-因此,现在我在
    retrieveItem()的开头执行
    em.flush()
    。迫不及待地想更换此应用程序。

    不幸的是,我能找到的唯一方法是修复事务的原因-因此,现在我正在
    em.flush()
    的开头执行
    retrieveItem()
    。迫不及待要更换此应用..

    谢谢。。我试过了,但还是不行。。我不完全确定它是否拾取了注释,因为我得到了一个“事务未激活”错误:(@Robert Wilson我的错误,我忽略了你使用BMT的事实。你能尝试注入
    UserTransaction
    并用它来启动/停止一个新的吗,而不是
    em.getTransaction
    ?谢谢..尝试过了,但它仍然不起作用..我不完全确定它是否接收到注释,因为我得到了一个“事务未激活”错误.:(@Robert Wilson我的错误,我忽略了您使用BMT的事实。您是否可以尝试注入
    UserTransaction
    ,并使用它来启动/停止一个新事务,而不是
    em.getTransaction