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ı'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;