DBAtlas · Veritabanı operasyon atlası

Bekleyen lock'ları nesne ve lock modu düzeyinde ayrıntılı gör (pg_locks)

PostgreSQLOturum

Komut

SELECT DISTINCT
       w.pid AS waiting_pid,
       w.locktype,
       coalesce(w.relation::regclass::text, 'xid ' || w.transactionid, w.virtualxid, w.objid::text) AS target,
       w.mode AS wanted_mode,
       b.pid AS blocker_pid,
       b.mode AS blocker_mode,
       b.granted AS blocker_holds,
       now() - wa.state_change AS waiting_for,
       left(wa.query, 60) AS waiting_query,
       left(ba.query, 60) AS blocker_query
FROM pg_locks w
JOIN pg_locks b
  ON b.pid = ANY (pg_blocking_pids(w.pid))
 AND b.locktype = w.locktype
 AND b.database IS NOT DISTINCT FROM w.database
 AND b.relation IS NOT DISTINCT FROM w.relation
 AND b.page IS NOT DISTINCT FROM w.page
 AND b.tuple IS NOT DISTINCT FROM w.tuple
 AND b.virtualxid IS NOT DISTINCT FROM w.virtualxid
 AND b.transactionid IS NOT DISTINCT FROM w.transactionid
 AND b.classid IS NOT DISTINCT FROM w.classid
 AND b.objid IS NOT DISTINCT FROM w.objid
 AND b.objsubid IS NOT DISTINCT FROM w.objsubid
JOIN pg_stat_activity wa ON wa.pid = w.pid
JOIN pg_stat_activity ba ON ba.pid = b.pid
WHERE NOT w.granted
ORDER BY waiting_for DESC, waiting_pid;

Ne yapar?

Verilmemiş (granted = false) her lock isteği için hedef nesneyi (tablo, transaction id vb.), istenen modu, engelleyen PID'i ve onun modunu, engelleyenin lock'u gerçekten tutup tutmadığını ve yaklaşık bekleme süresini gösterir.

Ne zaman kullanılır?

Blocking'in hangi tablo ve lock modu çakışmasından kaynaklandığını anlamak için; örn. DDL'in AccessExclusiveLock beklemesi veya row lock'ta transactionid beklemesi.

Dikkat

Eşleşme pg_blocking_pids() ile yapıldığı için yalnızca gerçekten çakışan istekler listelenir. blocker_holds = false, engelleyenin lock'u henüz almadığını, çakışan modla kuyrukta önde beklediğini gösterir (lock kuyruğu). locktype = 'transactionid' satır düzeyi çakışmadır: satırı değiştiren transaction bitene kadar beklenir; satırın kendisi pg_locks'ta görünmez. pg_locks büyük sistemlerde binlerce satır içerebilir; sorguyu sık çalıştırma. waiting_for, state_change üzerinden hesaplanan yaklaşık değerdir.

DBAtlas'ta aç →

İlgili