SuperAPI AI 工具集

postgres-errors-deadlocks

数据与分析

查看项目

更新于 10-15 22:18

技能介绍

用途:处理 PostgreSQL 事务死锁与锁冲突。适用场景:事务报 ERROR: deadlock detected(SQLSTATE 40P01)、设计跨行/跨表加锁顺序、构建多消费者工作队列、编写事务重试逻辑、用 pg_locks 与 pg_blocking_pids 诊断锁环。

核心结论:死锁不是 PostgreSQL 的缺陷,而是应用在不同代码路径以不一致顺序获取锁导致。而 40P01 出现时整个事务已被回滚,必须从 BEGIN 起重试整个事务并加退避,绝不能只重试失败语句。

需要整事务重试的错误:40P01 deadlock_detected(锁环,一方为牺牲者)、40001 serialization_failure(隔离级别冲突)、55P03 lock_not_available(NOWAIT 主动快速失败,仅在可等待时才重试)。

主要模式:用 SELECT ... FOR UPDATE ORDER BY id 固定全局加锁顺序;尽量用单条语句(UPDATE ... WHERE id IN/ANY)完成多行更新;阻塞比失败更糟时用 NOWAIT 得到可捕获的 55P03;队列用 FOR UPDATE SKIP LOCKED 让各 worker 取不同行;用 pg_blocking_pids() 关联 pg_stat_activity 定位阻塞链;保持事务短小,尽快 COMMIT。

行锁模式选择:更新键列或删除用 FOR UPDATE;仅更新非键列用 FOR NO KEY UPDATE;读且禁止并发修改用 FOR SHARE;仅禁止键变更或删除用 FOR KEY SHARE。

限制:不适用于无环的普通锁等待,也不用于 DDL 的 ACCESS EXCLUSIVE 阻塞或可串行化隔离级别设计本身,这些应参考系列内其他技能。

本项目其他细节(如安装命令、依赖版本、收费与平台支持)暂未提供。官方文档参考 https://www.postgresql.org/docs/17/explicit-locking.html 与 https://www.postgresql.org/docs/17/errcodes-appendix.html。