【发布时间】:2011-11-01 04:59:49
【问题描述】:
我正在使用带有 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 后给我值。我说的对吗?
(这不是一般的“我如何进行原子增量?”问题,已经有一个问题。这是关于这种特定方式是否有效。)
【问题讨论】:
-
你看过stdbrouw.github.com/django-locking - 我假设你这样做是为了乐观锁定