Сегодня у меня возникла серьезная проблема с нашим платежным процессом.
После того как компенсация будет завершена, две вещи:Предотвращение одновременных транзакций БД в приложении play2.1
- пользователь получает перенаправлены на успех-страницы на нашем сервере, редирект также присоединяет Payment ID
- поставщик платежных отправляет уведомление об оплате в том числе и идентификатор платежа на наш сервер
Когда пользователь перенаправляется на страницу успеха, мы проверяем, существует ли платеж с идентификатором платежа. Если это не так, мы создаем платеж pending
, который мы можем ему показать.
Когда провайдер платежных отправляет платежное извещение мы проверить, существует ли pending
платежа с платежным ид и установить его в active
, если платеж не существует, мы просто создать active
один.
Вот и проблема: оба события могут (и были!) Происходить одновременно, так что обе процедуры не нашли существующий платеж и поэтому были созданы два платежа. Один pending
и один active
.
Есть ли хороший способ обойти это поведение, возможно, используя замки или что-то в этом роде? Я использую Ebean ORM по умолчанию в java-игре 2.1.0 с MySQL db.
Спасибо за ваш совет. Я понимаю, что это не ошибка игры. Я просто хотел упомянуть о среде, в которой я работаю, поскольку я надеялся, что могут быть некоторые конкретные конфигурации/инструменты, которые могут помешать таким условиям гонки. Так что я думаю, что я буду реструктурировать свой код, чтобы отреагировать, если исключение sql выбрано для правильной работы в соответствующей процедуре. – Daniel