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ı üç tür açık kilit, tablo düzeyi 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 kullanır ve her ikisi de izin verilir. Başka bir senaryoda, bir işlem bir SELECT deyimi ve ACCESS SHARE kilidi ile verileri sorgular, ancak aynı zamanda başka bir işlem aynı tabloyu bırakmaya çalışır. Bir tablonun bırakılması için bu senaryoda verilmeyen ACCESS EXCLUSIVE kilidi gerekir.

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ı'da sekiz tür tablo düzeyinde kilit vardır ve bu tür kilitleri alan SQL komutları şunlardır:

Kilit Modu Edinen
PAYLAŞIYA ERİşİm SELECT komutu
SATıR PAYLAŞıMı GÜNCELLEŞTIRME IÇIN SEÇ ve PAYLAŞ komutları IÇIN SEÇ
ÖZEL SATıR UPDATE, DELETE ve INSERT komutları
GÜNCELLEŞTIRMEYI ÖZEL PAYLAŞ ÇÖZÜMLE, EŞ ZAMANLı DIZIN OLUŞTUR, İSTATISTIK OLUŞTUR, AÇıKLAMA AÇ, EŞ ZAMANLı OLARAK YENIDEN DIZINLE komutları, bazı ALTER INDEX ve ALTER TABLE komutları ve VACUUM (TAM DEĞIL)
PAYLAŞ CREATE INDEX (EŞ ZAMANLı değil) komutu
SATıRı ÖZEL OLARAK PAYLAŞ CREATE TRIGGER komutu ve bazı ALTER TABLE komutları
ÖZEL GERÇEKLEŞTIRILMIŞ GÖRÜNÜMÜ EŞZAMANLı OLARAK YENILE komutu
ÖZEL ERIŞIM DROP TABLE, REINDEX, TRUNCATE, CLUSTER, REFRESH MATERIALIZED VIEW (EŞZAMANLı değil) 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 ERİşİm PAYLAŞI Varolan SATIR PAYLAŞI Var olan SATIR ÖZEL Mevcut PAYLAŞI GÜNCELLESTİSİ ÖZEL Mevcut PAYLAŞ Mevcut SHARE ROW EXCL Mevcut ÖZEL KULLANıM Var olan ACCESS EXCLUSIVE
erişim paylaşımı istendi Engellendi
İstenen SATIR PAYLAŞI Engellendi Engellendi
İstenen SATIR ÖZELİ Engellendi Engellendi Engellendi Engellendi
İstenen PAYLAŞI GÜNCELLEŞTIRMESİ ÖZEL Engellendi Engellendi Engellendi Engellendi Engellendi
İstenen PAYLAŞ Engellendi Engellendi Engellendi Engellendi Engellendi
İstenen SHARE ROW EXCLUSIVE Engellendi Engellendi Engellendi Engellendi Engellendi Engellendi
İstenen ÖZEL KULLANıM Engellendi Engellendi Engellendi Engellendi Engellendi Engellendi Engellendi
İstenen ERİşİm ÖZELİ Engellendi Engellendi Engellendi Engellendi Engellendi Engellendi Engellendi Engellendi

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ı dört tür satır düzeyi kilit vardır ve diğer kilit türlerinin engellenmesi gereken diğer kilit türlerine bağlı olarak alınırlar:

-- Mevcut FOR KEY SHARE VAR OLAN PAYLAŞ ANAHTAR GÜNCELLEŞTIRMESİ YOK için var GÜNCELLEŞTIRME için Mevcut
ANAHTAR PAYLAŞıMı için istendi Engellendi
PAYLAŞILASI İstendİ Engellendi Engellendi
ANAHTAR GÜNCELLEŞTIRMESİ İSTENMİDİ Engellendi Engellendi Engellendi
GÜNCELLEŞTIRME için istendi Engellendi Engellendi Engellendi Engellendi

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;