PostgreSQL 死锁的定位与处理
日志出现 ERROR: deadlock detected,事务被中止,应用收到 deadlock_detected。数据库会选择一个事务回滚,通常不是数据库故障。
SELECT * FROM pg_stat_activity WHERE state <> 'idle';
SELECT * FROM pg_locks WHERE NOT granted;
SELECT pid, wait_event_type, wait_event, query
FROM pg_stat_activity WHERE wait_event_type = 'Lock';
SHOW deadlock_timeout;
SHOW log_lock_waits;
日志:
grep -i deadlock /var/log/postgresql/postgresql-*.log | tail -20
log_lock_waits 观察锁等待;不要盲目调大 deadlock_timeout。psql — 诊断 SQLjournalctl — 服务日志pg_stat_statements — SQL 统计合上页面,先回答,再展开对照。
deadlock detected 意味着什么?pg_stat_activity 中 wait_event_type = 'Lock' 的会话和 pg_locks 中 NOT granted 的记录,并开启 log_lock_waits 观察。