django - django 是否在查询之间缓存模型数据?

标签 django caching django-models race-condition

我正在使用 django 1.6,mysql 5.6 作为带有 innodb 表的数据库。在我的设置文件中调试设置为 false。

在脚本中,我循环遍历元素列表,检查它是否已存在于数据库中,如果不存在则创建,如下所示:

for item in list:
    try:
        MyModel.objects.get(field=item)
    except MyModel.DoesNotExist:
        MyModel.objects.create(field=item)

我希望只有当它不存在时才会在数据库中创建一个项目,但这种方法会创建多个具有相同字段值的项目。这里似乎进行了某种缓存。

这里有两个问题;

如何更改此行为,以便在每次循环运行时根据数据库的最新状态检查是否存在?

这种行为是否与我通过脚本运行有关?如果相同的循环将在 View 中运行。行为会有什么不同吗?

编辑:

我已经通过对类似问题的建议来将 transaction-isolation 更改为 READ-COMMITTED 。这会导致常规 Django View 操作出现性能缺陷吗?

最佳答案

看来您在这里遇到了竞争条件。如果您看一下 Django 原生为您提供的 get_or_create 代码,它看起来与您的类似

try:
   obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
   obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
obj.save()

事实上,上面的代码也可能受到竞争条件的影响,并且创建的对象多于 documentation 中创建的对象。还说:但是,如果在数据库级别没有为 get_or_create 调用中使用的 kwargs 强制执行唯一性(请参阅 unique 或 unique_together),则此方法容易出现竞争条件,这可能导致多行具有相同的同时插入参数。

因此,您的解决方案是在这种情况下使 field 独一无二。

或者,如果该字段不能是唯一的,我建议您尝试使用 transactions明确地。

from django.db import transaction 

with transaction.atomic():
    # do_database_stuff

关于django - django 是否在查询之间缓存模型数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688693/

相关文章:

python - 如何在DRF中有效地检查对象级别权限?

python - 如何删除用户消息而不出现查询错误?

python - 如何防止Django的label_tag函数转义标签?

windows - 当我们测量函数的性能时,如何清空缓存

带有不同和 order_by 的 Django 查询

java - 当方法没有参数时使用@CacheResult

mysql - Like语句的缓存和加速解决方案

android - 使用JSON从Android应用程序向Django服务器发送/接收.wav文件

python - 千位分隔符未在 Django 管理中应用

django - 上下文处理器与模板标签的最佳实践?