当前位置: 首页 > 知识库问答 >
问题:

为什么我得到EJBTransactionRolledbackException而不是OpOptimticLockException?

万高畅
2023-03-14

我与Wildfly和OpenJPA合作。我有一个乐观锁例外的情况。

我得到的错误消息是:

00:08:29373警告[com.arjuna.ats.arjuna](默认任务-39)arjuna01225:TwoPhaseCoordinator。beforeCompletion-SynchronizationImple失败

:org.apache.openjpa.persistence.乐观锁定异常:刷新到数据存储时检测到乐观锁定错误。以下对象可能已在另一个事务中同时修改:[com.earnix.eo.entities.optimizer.PricingMixEntity-30400]......

我的问题是EJBTransactionRolledbackException被抛出而不是乐观锁异常。因此,我的代码没有将异常视为乐观锁异常。您知道如何让Wildfly/JPA抛出EJBTransactionRolledbackException吗?

一些代码:

@Override
    public List<PricingMixHeader> releasePricingRule(PricingMixHeader header) throws EOException {
        for (int i = 0; ; i++) {
            try {
                return pricingRuleAccessor.releasePricingMix(header.getPk(), getSessionPk());
            } catch (RemoteException e) {
                DeadlockUtils.handleRemoteException(e, i);
            } catch (EODeadlockException e) {
                // recover from the deadlock
                DeadlockUtils.recover(i, e.getOriginalExceptionStack());
            }
        }
    }

这是客户端中的代码。pricingRuleAccessor。发布PricingMix(…)是对服务器端方法的远程方法调用。在服务器端,发生了乐观锁异常,然后捕获了RemoteException(TransactionRolledbackException继承自RemoteException)。

共有2个答案

宦兴朝
2023-03-14

当抛出的异常是导致回滚的RuntimeException时,JBoss总是将抛出的异常(在您的案例中是OptimisticLockException)包装在EJBTransactionRollbackException中。

在您的客户端代码中,您必须检查EJBTransactionRollbackException,然后检查原因是否是乐观锁定异常:

try {
...
} catch (EJBTransactionRollbackException e) {
    if (e.getCause() instanceof OptimisticLockException) {
       ...
    }
}
赵才俊
2023-03-14

我建议两件事:

1) 您可以在“OptimisticLockException”异常发生之前调用em.flush(),以获取此异常,然后根据需要抛出它。

2) 另一种可能是忽略出现OptimisticLockException的细节,并创建一个新的“MyRemoteException”(扩展EJBException的ApplicationException)。是这样的:

@ApplicationException(rollback = true)
public class MyRemoteException extends EJBException {
  ...
}

抛出此异常以被“视图层”捕获,然后它将决定显示哪些信息。

 类似资料:
  • 我现在有一个helloworld项目根据这个链接,我做了它的。帽子 文件成功。我有“DE-ABCM_TB”读卡器和SAM卡。 我的小程序AID是 我可以在卡片上选择我的小程序。(我通过"DualCard"发送SELECT APDU命令 2.8版“/pcsc选项卡)。我现在必须在发送时接收十六进制格式的hello 。但我收到6C0B!为什么我会得到这样的回应 我如何解决这个问题?我搜索了一下,但没有

  • 问题内容: 我希望有人能提供帮助。但是,每当我运行我的代码并尝试查看所有代码时,我都回到列表框中。 谁能看到原因? 码: 问题答案: 即使设置了列表框的和,我也总是要处理此问题。 您当前的代码正确无误,并且可以正常工作,如果您需要访问任意列的当前选定项目值,则可以让他们这样做: 我希望获得完整的结果是,如果您有更多的列,您仍然可以访问它们的值并对其进行任何操作。

  • 问题内容: public class Category { 在正在生成。 问题答案: 当您执行时,您称呼孩子们的。这里没有问题,只不过您在这里调用了父对象。这将称呼孩子,等等。 不错的无限循环。 摆脱它的最好方法是将您的方法更改为: 这样,您将不打印parentCategory,而仅显示其名称,不显示无限循环,不显示StackOverflowError。 编辑: 正如博洛在下面说的那样,您将需要检

  • 当我运行(Windows 7命令行)时: C:\rest-app\src\main\java\com\mycompany\app\test>java org.testng.testng testng.xml Suite1运行的测试总数:0,失败:0,跳过:0 ================================================== 此时我的testng.xml文件如下所