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

标签 java jboss transactions jakarta-ee jta

我遇到了一个使用 Java EE Bean 托管事务的遗留系统的情况。当它尝试检索刚刚创建的内容时,会抛出 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 中是非法的。

我并不是在寻找一个优雅的修复 - 正如我所说,这是遗留问题,我只需要一些可以对其进行分类的东西,直到整个东西在几个月内被替换!

干杯。

最佳答案

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

请注意:

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

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

关于java - 在 Java EE 中重新运行失败的容器管理事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150897/

相关文章:

java - 动态修改数组名称

java - 为什么我的 JVM 会进行一些运行时循环优化并使我的代码出现错误?

java - 使用select和option标签在jsp中插入数据

java - 不同应用服务器上 JNDI 中的自定义资源

eclipse - 如何在eclipse中全局添加jboss存储库到maven?

mysql - MySQL 中有什么事务?

java - JPanel时钟和按钮合并

java - 有没有办法在 JBoss 7.1.1 中记录 HTTP 发布数据?

api - Paypal 创建沙盒交易

c# - WCF 服务 : Dropped connection handling