Kilitlemeyi anlama

Tamamlandı

Çok Sürümlü Eşzamanlılık Denetimi (MVCC), çoğu senaryo için uygun eşzamanlılık ayarlarını sağlar. Ancak, bir uygulama tam olarak hangi satırların etkileneceğini ve belirli bir kilit düzeyiyle denetleyen belirli kilitler gerektiriyorsa, açık kilit modları bu ayrıntılı denetimi etkinleştirir.

PostgreSQL için Azure Veritabanı'nda üç tür açık kilit, tablo düzeyinde kilitler, satır düzeyi kilitler ve sayfa düzeyi kilitler vardır. İlk işlem bir kilit ister ve kabul edilirse istenen kilit mevcut kilit olur. Başka bir işlem aynı veriler üzerinde kilit almaya çalışırsa, özgün işlemle çakışmazsa kilit verilir.

Örneğin, iki işlem bir SELECT deyimiyle aynı verileri aynı anda sorgulayabilir. Bu istekler bir ACCESS SHARE kilidi kullanacaktır ve her ikisine de izin verilebilir. Başka bir senaryoda, bir işlem "SELECT" deyimi ve "ACCESS SHARE" kilidi ile veri sorgularken, aynı anda başka bir işlem aynı tabloyu silmeye çalışır. Bu senaryoda, bir tablonun bırakılması için gerekli olan ACCESS EXCLUSIVE kilidi verilmez.

Tablo düzeyinde kilitler

Tablo düzeyi kilitleri, adında SATIR olsa bile tablonun tamamında kilitler alır. Tablonun kendisi değiştiriliyorsa tablonun tamamını kilitlemek gerekebilir veya birçok satır düzeyi kilidin alınmasından daha verimli olabilir.

PostgreSQL için Azure Veritabanı'nda sekiz tür tablo düzeyinde kilit vardır ve bu tür kilitleri alan SQL komutları şunlardır:

Kilit Modu Edinilen
PAYLAŞIYA ERİşİm SELECT komutu
Satır Paylaşımı Güncelleme İçin Seç ve Paylaşım İçin Seç komutları
SATıRA ÖZEL UPDATE, DELETE ve INSERT komutları
GÜNCELLEŞTIRMEYI ÖZEL PAYLAŞ ANALİZ, EŞZAMANLI İNDEKS OLUŞTUR, İSTATİSTİK OLUŞTUR, YORUM YAP, EŞZAMANLI OLARAK YENİDEN İNDEKSLİ komutları, bazı ALTER INDEX ve ALTER TABLE komutları ve VACUUM (TAM DEĞİL)
PAYLAŞ CREATE INDEX (eş zamanlı değil) komutu
SATIR KİLİDİ PAYLAŞ(ÖZEL), TERCIHLİ CREATE TRIGGER komutu ve bazı ALTER TABLE komutları
SEÇKİN GERÇEKLEŞTİRİLMİŞ GÖRÜNÜMÜ EŞZAMANLI OLARAK YENİLE komutu
ÖZEL ERIŞIM DROP TABLE, REINDEX, TRUNCATE, CLUSTER, REFRESH MATERIALIZED VIEW (EŞZAMANLI OLMAYAN) komutları, çoğu ALTER INDEX ve ALTER TABLE komutları ve VACUUM FULL

Mevcut kilit türlerinin her biri, alınan diğer istenen kilitleri engeller. Aşağıdaki tabloda hangi kilitlerin diğer kilitlerin alınmasına engel olduğu listelenmektedir:

-- Mevcut Erişim Paylaşımı Varolan SATIR PAYLAŞI Var olan SATIR ÖZEL KİLİT Mevcut PAYLAŞI GÜNCELLESTİSİ ÖZEL Mevcut Paylaşım Mevcut SHARE ROW EXCL Mevcut ÖZEL KULLANıM Var olan ACCESS EXCLUSIVE
erişim paylaşımı istendi Bloklandı
İstenen SATIR PAYLAŞI Bloklandı Bloklandı
İstenen SATIR ÖZEL KİLİDİ Bloklandı Bloklandı Bloklandı Bloklandı
Talep Edilen Paylaş Güncellemesi Özel Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı
İstenen PAYLAŞ Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı
İstenen SATIR PAYLAŞIMI ÖZEL Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı
İstenen ÖZEL KULLANıM Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı
Talep Edilen ERİŞİM ÖZEL Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı Bloklandı

Satır düzeyi kilitler

Satır düzeyi kilitleri daha ayrıntılıdır ve yalnızca aynı satıra erişen başka bir işlemi etkiler. Bu kilit türü eşzamanlılığı artırır, ancak birçok kilidin alınması ve bırakılması performansı olumsuz etkiler. Satır düzeyi kilitler PostgreSQL tarafından otomatik olarak alınır ve el ile uygulanmaz.

PostgreSQL için Azure Veritabanı'nda dört tür satır düzeyi kilit vardır ve bunlar, engellenmesi gereken diğer kilit türlerine bağlı olarak alınır:

-- Var olan FOR KEY SHARE VAR OLAN PAYLAŞ MEVCUT 'NO KEY UPDATE' İÇİN GÜNCELLEŞTIRME için Mevcut
Anahtar Paylaşımı için Talep Edildi Bloklandı
PAYLAŞILASI İstendİ Bloklandı Bloklandı
ANAHTAR GÜNCELLEŞTIRMESİ İSTENMİDİ Bloklandı Bloklandı Bloklandı
GÜNCELLEŞTIRME için istendi Bloklandı Bloklandı Bloklandı Bloklandı

Sayfa düzeyinde kilitler

Sayfa düzeyi kilitler, genellikle birden çok satırdan oluşan bir veri sayfasını etkiler. PostgreSQL işlemleri sayfa düzeyinde kilitler kullansa da, uygulama geliştiricileri genellikle bu tür bir kilit gerektirmez.

Kilitleri el ile uygulama ve geçerli kilitleri görüntüleme

Tablo düzeyinde kilidi el ile uygulamak için, lock komutunu gerekli kilit moduyla kullanabilirsiniz. LOCK komutu bir işlem içinde olmalıdır ve işlem tamamlandığında kilitler serbest bırakılır. Örneğin:

BEGIN TRANSACTION;
LOCK TABLE humanresources.department IN ROW EXCLUSIVE MODE;
COMMIT;

Veritabanında tutulan kilitleri görüntülemek için pg_locks kullanın. Örneğin, tüm geçerli kilitleri görüntülemek için aşağıdaki komutu kullanın:

SELECT * FROM pg_locks;