我使用MySQL與InnoDB引擎和REPEATABLE-READ隔離級別。這是一個安全的方式來增加和獲得在Django計數器的價值?
我已經寫了一個函數,我認爲應該原子地增加一個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應該保證我的後續。在UPDATE之後get會給我值。我對嗎?
(這不是一般的「我該怎麼辦原子增量?」這個問題,有已其中的一個。這是這一個特殊的方式是否有效。)
你有沒有看着http://stdbrouw.github.com/django-locking/ - 我假定你這樣做是對樂觀鎖定 – dstarh
相關http://stackoverflow.com/questions/1598932/django中的反原子增量 –