JPA блокировка объекта для чтения - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть код:

public static Computation findByDateAndPaymentSystem(EntityManager em, Calendar date, PaymentSystem paymentSystem) throws SCException {
        Query query = em.createNamedQuery("Computation.findByDateAndPaymentSystem");
        query.setParameter("date", date);
        query.setParameter("ps", paymentSystem);
        List<Computation> computationList = query.getResultList();
        if (computationList != null && computationList.size() > 0) {
            if (computationList.size() == 1) {
                return computationList.get(0);
            } else {
                throw new SCException("Not unique result in computation for date '"
                        + new SimpleDateFormat("dd.MM.yyyy").format(new Date(date.getTimeInMillis())) + "' and paymentSystem = '"
                        + paymentSystem.getShortName() + "'");
            }
        } else {
            Computation computation = new Computation();
            computation.setDate(date);
            computation.setComputationState(ComputationState.CREATED);
            computation.setPaymentSystem(paymentSystem);
            em.persist(computation);
            return computation;
        }
    }

Основная идея заключается в том, что у меня должен быть один вычислительный экземпляр на дату и платежную систему.Но если этот метод вызывается в двух разных транзакциях, то возможны следующие сценарии: первая проверка транзакции, если нет вычислений на эту дату и выполняется вычисление, но все еще не зафиксировано вычисление созданного, еще одна проверка транзакции и также создается вычисление, тогда обе транзакции фиксируются.Таким образом, на одну дату будет два вычисления.

Как это предотвратить?

1 Ответ

1 голос
/ 11 ноября 2011
Комбинации

Computation.date и PaymentSystem должны быть уникальными (ограничение), тогда вторая вставка завершится неудачно, или вы можете попробовать объединить несколько записей, если найдете их.Решение зависит от вашего варианта использования, стратегии транзакций и настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...