django – 是get_or_create()线程安全

我有一个Django模型,只能使用get_or_create(session = session)访问,其中session是另一个Django模型的外键。

因为我只是通过get_or_create()访问,我想象我将只有一个实例与一个密钥的会话。但是,我发现多个实例与键的同一会话。发生什么事?这是一个竞争条件,还是get_or_create()原子操作?

Actualy它不是线程安全的,你可以看看QuerySet对象的get_or_create方法的代码,basicaly它做的是以下:

try:
    return self.get(**lookup), False
except self.model.DoesNotExist:
    params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
    params.update(defaults)
    obj = self.model(**params)
    sid = transaction.savepoint(using=self.db)
    obj.save(force_insert=True, using=self.db)
    transaction.savepoint_commit(sid, using=self.db)
    return obj, True

因此,两个线程可能会发现实例不存在于DB中,并开始创建一个新的实例,然后连续保存它们。

http://stackoverflow.com/questions/6416213/is-get-or-create-thread-safe

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:django – 是get_or_create()线程安全