gpt4 book ai didi

django - get_or_create() 线程安全吗

转载 作者:行者123 更新时间:2023-11-28 19:36:34 27 4
gpt4 key购买 nike

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

因为我只通过 get_or_create() 进行访问,所以我想我只会有一个具有 session key 的实例。但是,我发现多个实例具有同一 session 的 key 。怎么了?这是竞争条件,还是 get_or_create() 以原子方式运行?

最佳答案

不,get_or_create 不是原子的

它首先询问数据库是否存在满足要求的行;数据库返回,python检查结果;如果它不存在,它会创建它。在 getcreate 之间,任何事情都可能发生 - 与 get 条件对应的行由其他代码创建。

例如,对于您的特定问题,如果用户同时打开两个页面(或执行多个 ajax 请求),这可能会导致所有 get 失败,并且对于所有页面创建新行 - 使用相同的 session 。

因此,重要的是只使用 get_or_create 当重复问题将被数据库通过一些unique/unique_together,这样即使多个线程可以到达 save() 点,也只有一个会成功,其他线程会引发一个 IntegrityError,您可以捕获并处理。

如果您对数据库中不唯一的(一组)字段使用 get_or_create,您将在数据库中创建重复项,这很少是您想要的。

更一般地说:不要依赖您的应用程序来强制唯一性并避免数据库中的重复项!那是数据库的工作!(好吧,除非你用一些操作系统有效的锁来包装你的关键函数,但我仍然建议使用数据库)。

有了这些警告,正确使用 get_or_create 是一种易于阅读、易于编写的结构,可以完美地补充数据库完整性检查。

引用文献和引文:

关于django - get_or_create() 线程安全吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com