Я использую MySQL с движком InnoDB и уровнем изоляции REPEATABLE-READ.
Я написал функцию, которая, по моему мнению, должна атомарно увеличивать IntegerField и давать мне значение после приращения.Я хотел бы узнать, устойчив ли мой код к проблемам параллелизма.
Мой код выглядит следующим образом:
class MyModel(models.Model):
version = models.IntegerField()
@staticmethod
@transaction.commit_on_success
def acquire_version(pk):
MyModel.objects.filter(pk = pk).update(version = F('version') + 1)
return MyModel.objects.get(pk = pk).version
Я думаю, что при двух одновременных вызовах ОБНОВЛЕНИЯ взаимно исключают одиндругой из-за блокировки записи, а затем REPEATABLE-READ должен гарантировать, что мой последующий .get даст мне значение после ОБНОВЛЕНИЯ.Я прав?
(Это не общий вопрос «как сделать атомный прирост?», Уже один из них. Это вопрос о том, действителен ли этот конкретный способ.)