diff --git a/payment/views.py b/payment/views.py index c932968..c2c12db 100644 --- a/payment/views.py +++ b/payment/views.py @@ -1,6 +1,7 @@ import os import stripe from django.conf import settings +from django.db import transaction from django.utils.decorators import method_decorator from django.http import HttpResponse @@ -72,10 +73,14 @@ def post(self, request): session = event["data"]["object"] try: - payment = Payment.objects.get(session_id=session["id"]) - payment.status = Payment.Status.PAID - payment.save(update_fields=["status"]) - notify_payment_success.delay(payment.id) + with transaction.atomic(): + payment = Payment.objects.select_for_update().get( + session_id=session["id"] + ) + if payment.status != Payment.Status.PAID: + payment.status = Payment.Status.PAID + payment.save(update_fields=["status"]) + notify_payment_success.delay(payment.id) except Payment.DoesNotExist: pass