Я использую MySQL с движком InnoDB и уровнем изоляции REPEATABLE-READ.
Я написал функцию, которая, как мне кажется, должна атомически увеличивать IntegerField и давать мне значение после приращения. Мне хотелось бы узнать, уверен ли мой код в отношении проблем concurrency.
Мой код выглядит следующим образом:
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
Мое мышление заключается в том, что в двух одновременных вызовах UPDATE будут взаимно исключать друг друга из-за блокировки записи, а затем REPEATABLE-READ должны гарантировать, что мой следующий .get даст мне значение после UPDATE. Я прав?
(Это не общий вопрос "как я делаю атомный приращение?", уже есть один из них. Это вопрос о том, действительно ли этот конкретный способ.)