Как сделать так, чтобы мой API не мог обрабатывать один и тот же метод одновременно

У меня есть метод в моем API, который обрабатывает операции синхронизации с ERP компании. Этот метод вызывается раз в 30 минут скриптом, который я сделал для того, чтобы все всегда было актуально. Однако, если кто-то хочет, он может самостоятельно сделать запрос к конечной точке, но при этом ему нужно сообщить, обрабатывается ли операция в данный момент или нет

Итак, мое решение: я держу флаг в базе данных и устанавливаю его в значение true, когда транзакция продолжается, и false, когда она заканчивается, поэтому мое приложение будет проверять его и продолжать/останавливать, основываясь на этом условии

Есть только одна проблема: поскольку я храню все в одной транзакции, флаг фактически бесполезен, так как только внутри этой транзакции он будет установлен в значение true. Я думал обновлять флаг перед началом транзакции и возвращать его при возникновении ошибки, но я не могу гарантировать, что процесс возврата будет происходить в 100% случаев (поэтому есть возможность заблокировать операцию)

Мой код следующий, если кому-то он нужен для справки:

@api_view(['POST'])
def syncErpItems(request):
    try:
        with transaction.atomic():
            job = Jobs.objects.get(name='items')
            if job.updating:
                return Response({'message': 'Sync already ongoing'})
            job.updating = True
            job.save()

            updateItems()

            job.updating = False
            job.last_execution = timezone.now()
            job.save()
            return Response({'message': 'Success'})

    except Exception as e:
        return Response({'message': 'Error on sync: ' + str(e)})

Кое-что следует иметь в виду:

  • Нет возможности позволить блокировке произойти и вручную исправить ее позже, учитывая другие обстоятельства
  • .
  • Операция синхронизации занимает около 30/40 секунд, при этом из ERP поступает много контента
Вернуться на верх