相关疑难解决方法(0)

get_or_create()线程是否安全

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

由于我只是通过访问get_or_create(),我想我只会有一个带有会话密钥的实例.但是,我找到了多个具有同一会话密钥的实例.怎么了?这是一种竞争条件,还是get_or_create()以原子方式运作?

django multithreading django-models

29
推荐指数
3
解决办法
6775
查看次数

我如何处理django中的这种竞争条件?

此代码应该获取或创建一个对象,并在必要时更新它.该代码在网站上正在生产中使用.

在某些情况下 - 当数据库繁忙时 - 它将抛出异常"DoesNotExist:MyObj匹配查询不存在".

# Model:
class MyObj(models.Model):
    thing = models.ForeignKey(Thing)
    owner = models.ForeignKey(User)
    state = models.BooleanField()
    class Meta:
        unique_together = (('thing', 'owner'),)

# Update or create myobj
@transaction.commit_on_success
def create_or_update_myobj(owner, thing, state)
    try:
        myobj, created = MyObj.objects.get_or_create(owner=user,thing=thing)

    except IntegrityError:
        myobj = MyObj.objects.get(owner=user,thing=thing)
        # Will sometimes throw "DoesNotExist: MyObj matching query does not exist"

    myobj.state = state
    myobj.save()
Run Code Online (Sandbox Code Playgroud)

我在ubuntu上使用innodb mysql数据库.

我该如何安全地处理这个问题?

django innodb

28
推荐指数
1
解决办法
8932
查看次数

标签 统计

django ×2

django-models ×1

innodb ×1

multithreading ×1