У меня есть код:
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;
}
}
Основная идея заключается в том, что у меня должен быть один вычислительный экземпляр на дату и платежную систему.Но если этот метод вызывается в двух разных транзакциях, то возможны следующие сценарии: первая проверка транзакции, если нет вычислений на эту дату и выполняется вычисление, но все еще не зафиксировано вычисление созданного, еще одна проверка транзакции и также создается вычисление, тогда обе транзакции фиксируются.Таким образом, на одну дату будет два вычисления.
Как это предотвратить?