Kilitlemeyi anlama
Ç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;