You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

并发请求下Django出现IntegrityError主键重复冲突问题咨询

问题分析与解决方案

核心结论

这个主键重复的错误不是Django新版本变更导致,默认情况下Django依赖Postgres的自增序列生成主键,而Postgres的序列nextval是原子操作,理论上不会出现重复值。但在高并发场景下,若存在序列与表数据不同步或自定义主键逻辑的情况,就可能触发该错误。

可能的触发原因

  • 序列与表主键不同步:比如曾手动插入过指定id的User数据,或者之前有事务回滚导致序列值被消耗但未写入表,后续并发请求生成的序列值刚好与已存在的主键冲突。
  • 自定义主键生成逻辑:如果你的User模型没有使用默认的AutoField作为主键,而是自行实现了主键生成逻辑,Django不会自动处理这种竞态条件。

解决方法

  1. 检查并同步序列与表数据
    先执行以下SQL查询,确认序列值与表中最大主键值是否同步:

    -- 查询当前序列的下一个值
    SELECT nextval('user_id_seq');
    -- 查询表中最大的id值
    SELECT MAX(id) FROM "user";
    

    如果序列的下一个值小于等于表中最大id,执行以下SQL重置序列:

    ALTER SEQUENCE user_id_seq RESTART WITH (SELECT MAX(id)+1 FROM "user");
    
  2. 捕获异常并重试(高并发场景通用方案)
    即使序列同步,极端情况下仍可能出现冲突,此时可以在代码中捕获IntegrityError并重试创建:

    from django.db import IntegrityError
    import time
    
    def create_user():
        max_retries = 3
        for _ in range(max_retries):
            try:
                user = User()
                user.save()
                return user
            except IntegrityError:
                time.sleep(0.1)
        raise Exception("Failed to create user after multiple retries")
    
  3. 避免手动干预主键
    不要手动指定id值,完全依赖Django的AutoField和Postgres的自增序列来生成主键,从根源减少冲突可能。

关于Django的竞态处理

Django默认不会自动处理这类并发创建的竞态条件,因为这会带来额外的性能开销。开发者需要根据业务场景,自行选择合适的处理方式(比如重试、数据库锁等)。

内容的提问来源于stack exchange,提问作者Snobby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:52:22