在我的Django应用程序中,我经常需要做一些类似于get_or_create()的事情.例如,

用户提交一个标签.需要看看

但是看了文档get_or_create()年后,它看起来不是线程安全的.线程A判断并发现记录X不存在.然后线程B判断并发现记录X不存在.现在线程A和线程B都将创建一个新的记录X.

这一定是一种非常普遍的情况.如何以线程安全的方式处理它?

推荐答案

这一定是一种非常普遍的情况.如何以线程安全的方式处理它?

SQL中的"标准"解决方案是简单地try 创建记录.如果它起作用了,那很好.继续往前走.

如果try 创建记录时从RDBMS获得"重复"异常,则执行SELECT并继续操作.

但是,Django有一个ORM层,它有自己的缓存.因此,逻辑被颠倒,使常见的情况直接快速地工作,而不常见的情况(重复的)引发罕见的异常.

Database相关问答推荐

触发器作为完整性的判断约束

MYSQL CASE 语句多条件

用于为 Android 设计 SQLite 数据库的开发人员工具

在不稳定的网络中保持分布式数据库同步

如何开始使用 SQLCipher for android?

repeating groups是什么意思?

Spring Framework 中的默认隔离级别

一个 5MB 的 SQL 数据库可以存储多少数据?

保存图像:文件还是 blob?

使用 jQuery 动态填写表单值

在 SQL SERVER 中监视 SQL 查询的进度

South migration error: NoMigrations exception for django.contrib.auth

每个 Docker 容器一个或多个数据库

Hibernate、spring、JPS 和隔离 - 不支持自定义隔离

执行语句还是运行脚本?

JOOQ 与Hibernate

对于 Postgres (Windows),有没有像 TOAD 一样好的东西?

为数据库应用程序留下审计跟踪/更改历史的有效策略?

MySQL 数据库中列名中的连字符

数据库效率 - 每个用户的表与用户表