java - 在 Hibernate 中处理竞争条件

标签 java hibernate tomcat servlets

希望有人能指出正确的方向,说明为什么这不起作用:

    Session session = factory.openSession();
    session.refresh(customer);
    session.close();
    Boolean paid = customer.hasPaid();
    if (paid) {
        System.out.println("test1");
    } else {
        System.out.println("test2");
    }

    if (!paid && paymentInput.getRequestType() == PaymentInput.RequestType.NEW) {
        session = factory.openSession();
        Transaction tx = session.beginTransaction();
        customer.setPaid(true);
        customer.update(customer, customer.getId());
        tx.commit();
        session.close();
        System.out.println("updated");

        PaymentProcessor.pay(customer);
    }

我想要的是第一个请求命中“test2”,然后是“更新”,所有其他请求命中“test1”并错过第二个条件。如果我在彼此之后快速触发多个请求,目前它会点击“test1”并多次进入第二个条件。我在这里做错了什么?

最佳答案

其他测试不命中“test1”的唯一方法是让它们在第 16 行之后开始它们的交易——tx.commit();——已经完成了它的工作。你的目标是什么?如果您的请求必须假设事务已提交,您将不得不强制它们等待,直到该假设成立。这通常是通过某种锁来完成的。

关于java - 在 Hibernate 中处理竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44831279/

相关文章:

java - 按钮对点击没有反应

java - 使用正则表达式查找字符串中的所有字母

java - 无法通过 chrome/firefox 获取请求参数值。与双重转义有关?

tomcat - 如何将现有服务器添加到 Liferay Developer Studio?

java - 如何将现有的 SOAP 请求消息导入 SoapUI?

java - 同时搜索多个HashMap

java - 将 java 对象持久保存到 xml 所需的建议

java - Hibernate - 如何提供对整数类型的正确映射?

java - @ElementCollection 至少包含一个元素,最多包含 N 个元素

java - 多进程监听端口时,tomcat为什么会收到请求?