当前位置: 首页 > 面试题库 >

JPA:用于处理OptimisticLockException的模式

蔡修远
2023-03-14
问题内容

在(REST)Web服务中处理OLE的正确模式是什么?例如,这就是我现在正在做的

protected void doDelete(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    ...
    ...
    ...

    try {
        try {
            em.getTransaction().begin();
            // ... remove the entity
            em.getTransaction().commit();
        } catch (RollbackException e) {
            if (e.getCause() instanceof OptimisticLockException) {
                try {
                    CLog.e("optimistic lock exception, waiting to retry ...");
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                }
                doDelete(request, response);
                return;
            }
        }

        // ... write response

    } catch (NoResultException e) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
        return;
    } finally {
        em.close();
    }
}

每当您在代码中看到睡眠时,很可能这是不正确的。有没有更好的方法来解决这个问题?

另一种方法是立即将故障发送回客户端,但我宁愿不要让他们为此担心。正确的事情似乎可以完成使请求在服务器上成功执行的所有操作,即使它需要一段时间。

谢谢。


问题答案:

如果收到乐观的锁定异常,则意味着其他某个事务已将更改 提交 给您尝试更新/删除的实体。由于其他事务已提交,因此立即重试可能会成功。

我还会使方法在N次尝试后失败,而不是等待StackOverflowException发生。



 类似资料:
  • 我是JPA新手,这里是我的一个查询,我有几个参数作为查询的一部分,任何参数都可以是空值

  • 这里是再现异常的示例项目。 null UPD:使用任务执行器的工作放在另一个分支中。Spring与事务性任务相结合可以解决这个问题。

  • 11.4 基于ItemReaders的driving query 在readers 和writers章节中对数据库分页进行了讨论,很多数据库厂商,比如DB2,如果读表也需要使用的在线应用程序的其他部分,悲观锁策略,可能会导致问题.此外,打开游标在超大数据集可能导致某些供应商的问题.因此,许多项目更喜欢使用一个’Driving Query’的方式读入数据.这种方法是通过遍历keys,而不是整个对象,

  • 假设我想合并一个分离的实体。当我做的时候 entityManager将从数据库加载一个实体(具有与detachedEntity相同的标识符),并将所有数据从detachedEntity复制到新加载的实体。当以后我的事务结束时,这个实体将保存到数据库中。

  • 问题内容: 我正在寻找一个不会重建整个DOM文档来查找文档节点的XPath评估器:实际上,该对象是使用SAX模型来管理大量XML数据(理想情况下为2Gb以上)有利于内存管理,并提供了搜索节点的可能性。 谢谢大家的支持! 对于所有那些说不可能的人:最近,在问了这个问题之后,我找到了一个名为“ saxpath”的项目(http://www.saxpath.org/),但是我找不到任何实施项目。 问题答

  • 在happy path场景中,我有一个spring批处理工作,但现在我将重点放在错误处理上。 但是,在另一个测试中,我想证明一个不可预见的数据库错误会导致作业失败。为此,我创建了一个触发器,该触发器会导致对要插入的表的插入失败。 这似乎起作用了,在writer执行之后,在事务提交期间抛出异常,并且我得到以下日志消息: 这似乎也是预期的行为。问题是,这并不能阻止工作。该步骤退出到SimplyRetr