Postgresql Lock
Postgresql Lock Tablolar, sıralar veya veritabanı nesneleri üzerinde eşzamanlı erişimi kontrol etmek için PostgreSQL ve diğer veritabanı sistemleri “kilitler” kullanır. Kilitler, bir işlemin belirli bir kaynağı başka bir işlemle paylaşmasını önler ve böylece veri bütünlüğünü korur. PostgreSQL’de kilitler, farklı tiplerde ve kapsamlarda gelir.
Postgresql Lock hakkında temel bilgiler:
İşlem Kilitleri: PostgreSQL’de her işlem, bir veritabanı işlemi sırasında farklı düzeylerde kilitler alabilir. Örneğin, bir işlem bir tablo üzerinde okuma veya yazma işlemi yaparken o tabloya kilit alabilir.
Satır Kilidi: PostgreSQL, özellikle UPDATE veya DELETE işlemleri sırasında belirli satırları kilitleyebilir. Bu, aynı anda birden fazla işlem tarafından aynı satırların değiştirilmesini önler ve veri bütünlüğünü sağlar.
Tablo Kilidi: PostgreSQL, bir tabloyu tamamen kilitleyebilir, böylece bu tabloya erişim engellenir ve diğer işlemler tarafından beklenmesi gerekir. Tablo kilidi, belirli bir işlem sırasında tam tabloya erişim gerektiğinde kullanılır.
Paylaşılan Kilitler: PostgreSQL, okuma işlemleri için paylaşılan kilitler sağlar. Bu, aynı anda birden fazla işlem tarafından bir kaynağın okunmasına izin verir, ancak yazma işlemleri için eksklüsif bir kilit gerektirir.
Deadlock’lar: PostgreSQL’de deadlock, iki veya daha fazla işlemin birbirini beklemesi sonucu oluşan durumdur. Deadlock’lar, işlemlerin durmasına ve manuel müdahale gerektirebilir.
Kilitler, veritabanı işlemlerinin güvenli ve tutarlı olmasını sağlar. Ancak, aşırı kullanıldığında veya yanlış yapılandırıldığında performans sorunlarına neden olabilirler. Bu nedenle, PostgreSQL’de kilit yönetimi dikkatlice yapılmalı ve gereksiz kilitlenmelerden kaçınılmalıdır.
Postgresql.conf’daki lock ile ilgili parametreleri görmek için Postgresql LOCK MANAGEMENT isimli yazıma göz atabilirsiniz.
Postgresql de lockları görüntülemek için aşağıdaki scripti kullanabilirsiniz.
SELECT a.datname,
l.relation::regclass,
l.transactionid,
l.mode,
a.usename,
a.query,
a.query_start,
age(now(), a.query_start) AS "age",
a.pid
FROM pg_stat_activity a
JOIN pg_locks l ON l.pid = a.pid
WHERE
l.GRANTED=false
ORDER BY a.query_start;