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

Redshift查询两表差异数据时触发Serializable隔离级别冲突错误

可序列化隔离级别冲突问题解决

你遇到的错误翻译为:

SQL错误 [XX000]: 错误: 1023
详情: 表-308739上的可序列化隔离级别冲突,形成循环的事务为: 5108879, 5091071 (进程ID:1073955294)

这是PostgreSQL在**可序列化(Serializable)**隔离级别下的典型事务冲突,当你的查询和其他并发事务访问相同表时形成依赖循环,数据库为了保证数据一致性终止了当前查询。以下是几种可行的解决办法:

  • 调整事务隔离级别
    如果业务逻辑允许,将隔离级别降到PostgreSQL默认的READ COMMITTED,该级别不会触发这类序列化冲突。执行以下语句后重新运行查询:

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
  • 重写查询逻辑
    用LEFT JOIN替代NOT IN,不同的执行计划可能避免冲突:

    SELECT DISTINCT cte.maker_addr, cte.tkn_id
    FROM (
        SELECT maker_addr, token1_id AS tkn_id FROM updation_table
        UNION
        SELECT maker_addr, token0_id AS tkn_id FROM updation_table
    ) cte
    LEFT JOIN makeraddr_tokenid_properties mtp 
        ON cte.maker_addr = mtp.maker_addr AND cte.tkn_id = mtp.token_id
    WHERE mtp.maker_addr IS NULL;
    
  • 添加重试机制
    如果必须使用可序列化隔离级别,在应用层捕获该错误后自动重试查询——这类冲突通常是瞬时的,重试大概率能成功。

  • 优化表索引
    给涉及的字段添加复合索引,减少查询锁的持有时间,降低冲突概率:

    -- 为updation_table创建索引
    CREATE INDEX idx_updation_maker_token1 ON updation_table(maker_addr, token1_id);
    CREATE INDEX idx_updation_maker_token0 ON updation_table(maker_addr, token0_id);
    
    -- 为makeraddr_tokenid_properties创建复合索引
    CREATE INDEX idx_maker_token_pair ON makeraddr_tokenid_properties(maker_addr, token_id);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:30:02