postgres-lock-wait

PostgreSQL 锁等待

现象

业务写入超时或长时间不返回,pg_stat_activity 中出现大量 wait_event_type = Lock;应用日志报 canceling statement due to statement timeout 或死锁。

快速定位

psql -c "SELECT pid, wait_event_type, wait_event, state, query_start, query
FROM pg_stat_activity WHERE wait_event_type = 'Lock';"

查看阻塞链:

psql -c "SELECT blocked.pid AS blocked_pid, blocking.pid AS blocking_pid,
blocked.query AS blocked_query, blocking.query AS blocking_query
FROM pg_stat_activity blocked
JOIN pg_locks bl ON bl.pid = blocked.pid
JOIN pg_locks kl ON kl.locktype = bl.locktype
  AND kl.database IS NOT DISTINCT FROM bl.database
  AND kl.relation IS NOT DISTINCT FROM bl.relation
  AND kl.page IS NOT DISTINCT FROM bl.page
  AND kl.tuple IS NOT DISTINCT FROM bl.tuple
  AND kl.transactionid IS NOT DISTINCT FROM bl.transactionid
JOIN pg_stat_activity blocking ON blocking.pid = kl.pid
WHERE NOT bl.granted;"

常见根因

修复

相关命令