我正在使用InnoDB引擎和REPEATABLE-READ隔离级别的MySQL。
我编写了一个函数,我认为应该原子地递增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
我认为在两个并发调用中,由于写锁的缘故,UPDATE将相互排斥,然后REPEATABLE-READ应该保证我的后续.get将给出UPDATE之后的值。 我是正确的吗?
(这不是一个一般的“如何执行原子递增?”问题,已经有了一个这样的问题。这是关于这种特定方法是否有效的问题。)