处理Hibernate中的竞争条件

时间:2017-06-29 17:12:25

标签: 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"并多次输入第二个条件。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

其他测试没有点击“test1”的唯一方法是让他们在第16行 - tx.commit();完成其工作后开始他们的交易。你的目标是什么?如果您有必须假设提交事务的请求,则必须强制它们等待,直到该假设成立为止。这通常是通过某种锁定来完成的。