我使用的是MySQL与InnoDB引擎和REPEATABLE-READ隔离级别。在
我写了一个函数,我认为它应该以原子方式递增一个整数字段,并在递增之后给我一个值。我想知道我的代码是否能抵抗并发问题。在
我的代码如下:
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在更新后会给我这个值。我说得对吗?在
(这不是一般的“我怎么做原子增量?”问题,已经有一个了。这是关于这一特定方法是否有效。)
一般的经验法则是any sort of custom queries or customized query behavior should go into manager methods. 这在您的情况下是有意义的,因为您可以在非常低的级别上递增、保存和返回版本号:在实际查询期间。在
因此,使用管理器(
object = MyManager()
)并编写一个SQL查询,该查询增加版本号(UPDATE mytable SET version=(version+1) WHERE pk=pk
,请参见here),并在执行任何其他调用之前立即返回模型实例的增量版本。在另请参见Managers
相关问题 更多 >
编程相关推荐