У меня есть модель MyModel с полем expiration_datetime.
Каждый раз, когда пользователь получает экземпляр MyModel, мне нужно сначала проверить, истек ли он или нет.Если срок его действия истек, нужно увеличить счетчик, обновить другие, а затем продлить время expiration_datetime до некоторого времени в будущем.
Таким образом, представление будет выглядеть примерно так:
if object.expiration_datetime < datetime.datetime.now():
object.counter = F('counter') + 1
object.expiration_datetime = F('expiration_datetime') + datetime.timedelta(days=1)
object.save()
В приведенном выше коде есть условие гонки.Скажем, поток 1 проверяет и находит, что текущий экземпляр истек, он продолжает увеличивать счетчик и продлевать время истечения срока.Но прежде чем он смог сделать это, поток 2 запланирован и делает то же самое.К тому времени, когда поток 1 наконец завершает свою работу, счетчик увеличивается вдвое, а время expration_datetime увеличивается вдвое.
Похоже, это должно быть довольно распространенной проблемой.Какой самый эффективный способ справиться с этим?В идеале я хотел бы иметь возможность обрабатывать его в Django с помощью переносимой базы данных.