40P01: deadlock_detected
PostgreSQL含义
两个或多个事务各自等待对方持有的锁而陷入死锁。PostgreSQL 检测到该循环并取消其中一个事务。
原因
以不同顺序获取锁、交叉更新相同的行、长事务,或外键检查期间获取了相互冲突的锁。
解决方法
服务器日志中的死锁详情会显示冲突的查询。在所有事务中以相同顺序访问表/行。保持事务简短。在应用中捕获被取消的事务并重试。关联 pg_locks 与 pg_stat_activity 检查锁。必要时用 SELECT ... FOR UPDATE 显式确定加锁顺序。