Technologies/PostgreSQL/postgresql.locks
PostgreSQLPostgreSQLMetric

postgresql.locks

Active locks
Dimensions:None
Available on:DatadogDatadog (1)OpenTelemetryOpenTelemetry (1)PrometheusPrometheus (1)
Interface Metrics (3)
DatadogDatadog
Enabled with `relations`. The number of locks active for this database. This metric is tagged with db, lock_mode, lock_type, schema, table, granted.
Dimensions:None
OpenTelemetryOpenTelemetry
The number of database locks.
Dimensions:None
PrometheusPrometheus
Number of locks
Dimensions:None

Technical Annotations (50)

Configuration Parameters (5)
FP_LOCK_SLOTS_PER_BACKENDrecommended: 16
Default fast path lock slots per backend process - not user-configurable
statement_timeoutrecommended: 30s
prevents indefinite lock waits by canceling statements
idle_in_transaction_session_timeoutrecommended: 1-5min
timeout for idle transactions to prevent lock holding
hot_standby_feedbackrecommended: off (if replica freshness not critical)
Prevents replica queries from blocking primary VACUUM, trading off potential replication lag
lock_timeoutrecommended: 5s
Prevents queries from waiting indefinitely for locks
CLI Commands (21)
SELECT n.nspname AS schema, c.relname AS table, l.locktype, l.mode, l.fastpath FROM pg_locks l JOIN pg_class c ON l.relation = c.oid JOIN pg_namespace n ON c.relnamespace = n.oiddiagnostic
SELECT * FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid;diagnostic
SELECT * FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid WHERE pl.granted = false;diagnostic
SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx ON pl.virtualtransaction = '-1/' || ppx.transaction;diagnostic
pg_terminate_backend(pid)remediation
SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid, blocked_activity.usename AS blocked_user, blocking_activity.usename AS blocking_user, now() - blocked_activity.xact_start AS blocked_transaction_duration, now() - blocking_activity.xact_start AS blocking_transaction_duration, concat(blocked_activity.wait_event_type,':',blocked_activity.wait_event) AS blocked_wait_event, concat(blocking_activity.wait_event_type,':',blocking_activity.wait_event) AS blocking_wait_event, blocked_activity.state AS blocked_state, blocking_activity.state AS blocking_state, blocked_locks.locktype AS blocked_locktype, blocking_locks.locktype AS blocking_locktype, blocked_activity.query AS blocked_statement, blocking_activity.query AS blocking_statement FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid WHERE NOT blocked_locks.GRANTED;diagnostic
SET statement_timeout = '30s';remediation
SELECT pg_try_advisory_lock(table_id) FROM my_table;remediation
SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction'diagnostic
SELECT pid, usename, pg_blocking_pids(pid) AS blocked_by, query AS waiting_query, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event_type = 'Lock';diagnostic
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid IN (SELECT unnest(pg_blocking_pids(waiting_pid)));remediation
SELECT pg_cancel_backend(pid);remediation
WITH RECURSIVE lock_tree AS ( SELECT pid, pg_blocking_pids(pid) AS blockers, query, 0 AS depth FROM pg_stat_activity WHERE cardinality(pg_blocking_pids(pid)) > 0 UNION ALL SELECT a.pid, pg_blocking_pids(a.pid), a.query, lt.depth + 1 FROM pg_stat_activity a JOIN lock_tree lt ON a.pid = ANY(lt.blockers) WHERE lt.depth < 5 ) SELECT * FROM lock_tree ORDER BY depth;diagnostic
SELECT * FROM tasks WHERE status = 'pending' FOR UPDATE SKIP LOCKED LIMIT 1;remediation
SELECT * FROM orders WHERE id = 1 FOR UPDATE NOWAIT;remediation
SELECT pid, locktype, relation::regclass, mode, granted, query FROM pg_locks l JOIN pg_stat_activity a ON l.pid = a.pid WHERE relation IS NOT NULL;diagnostic
SELECT blocked.pid AS blocked_pid, blocked.query AS blocked_query, blocking.pid AS blocking_pid, blocking.query AS blocking_query, blocked.wait_event_type, blocked.wait_event FROM pg_stat_activity blocked JOIN pg_locks blocked_locks ON blocked.pid = blocked_locks.pid JOIN pg_locks blocking_locks ON blocked_locks.locktype = blocking_locks.locktype AND blocked_locks.relation = blocking_locks.relation AND blocked_locks.pid != blocking_locks.pid JOIN pg_stat_activity blocking ON blocking_locks.pid = blocking.pid WHERE NOT blocked_locks.granted AND blocking_locks.granted;diagnostic
SELECT pg_terminate_backend(blocking_pid);remediation
SELECT pg_cancel_backend(blocking_pid);remediation
SELECT blocked_locks.pid AS blocked_pid, blocked_activity.usename AS blocked_user, blocking_locks.pid AS blocking_pid, blocking_activity.usename AS blocking_user, blocked_activity.query AS blocked_query FROM pg_locks blocked_locks JOIN pg_stat_activity blocked_activity ON blocked_locks.pid = blocked_activity.pid JOIN pg_locks blocking_locks ON blocked_locks.locktype = blocking_locks.locktype AND blocked_locks.relation = blocking_locks.relation AND blocked_locks.pid <> blocking_locks.pid JOIN pg_stat_activity blocking_activity ON blocking_locks.pid = blocking_activity.pid WHERE NOT blocked_locks.granted;diagnostic
SELECT pid, relname, state, query_start, query FROM pg_stat_activity WHERE query LIKE '%autovacuum%';diagnostic
Technical References (24)
pg_lockscomponentungranted locksconceptlock contentionconceptlock managercomponentLWLockcomponentfast path lockingconceptPGPROCcomponentpartition pruningconceptAccessShareLockcomponentpg_blocking_pids()componentpg_stat_activitycomponentpg_prepared_xactscomponentprepared transactionsconcepttransactionidconceptrow-level locksconceptpg_advisory_lockcomponentsession-level locksconceptadvisory lock ID spaceconceptwait_eventcomponentwait_event_typecomponentpg_blocking_pidscomponentlock_tree CTEconceptFOR UPDATE SKIP LOCKEDconceptFOR UPDATE NOWAITconcept
Related Insights (20)
Ungranted locks on a relation indicate contention among database clientswarning
Lock contention affects overall database performancewarning
Fast path lock exhaustion causes lock manager contention during read operationswarning
Partitioned table scan without pruning exhausts fast path lockswarning
Lock contention visible in pg_locks indicates waiting processeswarning
Prepared transactions hold locks indefinitely until commit or rollbackcritical
Row-level locks not visible in pg_locks during normal operationinfo
Advisory locks accumulate when queries acquire locks on rows not returned by LIMIT clausewarning
Advisory lock conflicts from unintended shared lock ID space between application componentswarning
Blocked sessions waiting for advisory locks held by other sessionswarning
Deadlocks causing transaction failures and timeoutswarning
Long-running queries cause lock contention and block other operationscritical
Idle transactions hold locks and block operationscritical
Long-running queries on read replica with hot_standby_feedback cause periodic CPU spikes on primarywarning
Queries blocked by lock contention wait indefinitely without timeoutwarning
Lock blocking chains create cascading query delayswarning
Queue-like patterns cause lock contention on pending taskswarning
Excessive exclusive locks indicate lock contention blocking querieswarning
Blocking locks cause query delays and timeoutscritical
Long-running autovacuum workers block operationswarning