Bekleyen lock'ları nesne ve lock modu düzeyinde ayrıntılı gör (pg_locks)
PostgreSQLOturumKomut
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.
İlgili
- Backend'i sonlandır (pg_terminate_backend)
- Çalışan sorguyu iptal et (pg_cancel_backend)
- Aktif ve bloklayan sorguları gör
- Blocking ağacını çıkar (kök bloklayan oturumu bul)
- Uzun süren ve 'idle in transaction' kalan transaction'ları bul
- Uzun süre 'idle in transaction' bekleyen oturumları toplu ve kontrollü sonlandır