Django为原子插入锁定行

2024-05-13 18:40:41 发布

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

我们使用的是django1.3。我们的模型是:

class Info(models.Model):
    class Meta:
        ordering = ('-ts','snp_number',)

    ts = models.DateTimeField(auto_now_add = True)
    description = models.TextField()
    release = models.CharField(max_length=50)
    stream = models.CharField(max_length=100)

class Snap(models.Model):
    class Meta:
        ordering = ('-snp',)
        unique_together = ('snp','app_name')

    snp = models.ForeignKey(SnapInfo)
    app_name = models.CharField(max_length=255)
    parent_app_name = models.CharField(max_length=255)

class Env(models.Model):
    class Meta:
        ordering = ('-snp',)

    snp = models.ForeignKey(Snap)
    env = models.CharField(max_length=50)

class Connection(models.Model):
    class Meta:
        ordering = ('-snp',)

    snp = models.ForeignKey(Snap)
    app_name = models.CharField(max_length=255)

对于给定的Info,我们可以有多个Snap。对于给定的Snap,我们可以有多个ConnectionEnv

写入

在我们的应用程序的某个地方,我们可以在

@transaction.commit_on_success
def create_snap_controller (topo_id=None, release=None, type=PREP, is_live=False):

    try:
        snp_info = Info.get_or_create_snap(release_name, type)
    except Exception as e:
        log.error("%s - Error creating snap Info for the release %s and type %s " %(str(e), release_name, type))
    ...
    return create_snap(snp_info, app_name, parent_name)

def create_snap(info, app_name, parent_name):
    ...
    snp = Snap.objects.create(snp=info, app_name=app_name, parent_app_name=parent_name)

    for conn in connections:
        conn = Connection.objects.create(snp=snp, app_name=conn)
    for env in envs:
        create_env(snp, env)
    ...
    return snp

def create_env(snp, env):
    ....
    e = Env.objects.create(snp=snp, env=env)

阅读

还有一个API,它读取这些最新的Snap和给定的app_name,并返回自身的JSON以及所有相关的EnvConnection

并发问题

问题是,由于提交未完成,API有时会返回部分数据。也就是说,当API正在进行提交时,它会返回部分最新信息

我们希望使插入成为原子的,这样通过API进行的读取就不会包含部分信息

迄今为止的努力

select_for_update(从1.4开始)似乎会锁定行,但不能确保原子性transaction.commit_on_success也不能保证原子性。我该怎么办


Tags: nameinfoenvappreleasemodelscreatelength