У меня есть эта сделка:состояние гонки, хотя использование транзакций
em.getTransaction().begin();
{
final Payment payment = em.find(Payment.class, id);
if (payment.status != Status.INIT)
throw new IllegalStateException("Cannot set to PAID, is not INIT but " + status);
payment.status = Status.PAID;
}
em.getTransaction().commit();
log.info("Payment " + id + " was paid");
Однако, как вы можете видеть здесь, сделка не препятствует состояние гонки:
[11:10:18.265] INFO [PaymentServlet] [MSP] Status COMPLETED
[11:10:18.265] INFO [PaymentServlet] Payment c76f9e75-99d7-4721-a8ac-e3a638dd8317 was paid
[11:10:18.267] INFO [PaymentServlet] [MSP] Status COMPLETED
[11:10:18.267] INFO [PaymentServlet] Payment c76f9e75-99d7-4721-a8ac-e3a638dd8317 was paid
оплата устанавливается в PAID
дважды. Мое исключение не выбрасывается, и нет откат или что-то еще.
Что я делаю неправильно?
У вас есть поле @Version в платеже? – Anonymoose
@Anonymoose Нет, у меня нет особых возможностей параллелизма в любом месте. Я думал, что для этого нужны транзакции. –
Это ваша «специальная вещь параллелизма». – unbeli