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
相关产品推荐
相关产品推荐

