在Django中,这是递增和获取计数器值的安全方法吗?

2024-03-29 12:57:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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在更新后会给我这个值。我说得对吗?在

(这不是一般的“我怎么做原子增量?”问题,已经有一个了。这是关于这一特定方法是否有效。)


Tags: 函数代码引擎readgetobjectsversionmodels
1条回答
网友
1楼 · 发布于 2024-03-29 12:57:28

一般的经验法则是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

相关问题 更多 >