Kilitlenmeler, Kilitleme ve MVCC
Veritabanlarının çakışmaları nasıl önlediği ve kilitleme ile anlık görüntü arasındaki ödünleşimler.
Kilitlenmeler, Kilitleme ve MVCC, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.
Veritabanları Yalıtımı Gerçekte Nasıl Uygular
Yalıtım düzeyleri vaattir; kilitleme ve MVCC bu vaadi yerine getiren mekanizmalardır. Mülakatçılar, işlemler çakıştığında arka planda neler olduğunu anlayıp anlamadığınızı görmek için bunları sorar.
İki temel strateji vardır:
- Kötümser (kilitleme): Çakışan erişimleri, bir kilit bırakılana kadar engellemek.
- İyimser / MVCC: Herkesin tutarlı bir anlık görüntüyü okumasına izin verip çakışmaları COMMIT sırasında tespit etmek.
Bu derste kilitler, kilitlenmeler ve MVCC'nin yanı sıra bunlar arasındaki ödünler ele alınır.
Paylaşımlı ve Özel Kilitler
Klasik kilitlemede iki temel kip kullanılır:
- Paylaşımlı (S) kilit, okumalar için kullanılır. Birçok işlem aynı satır üzerinde aynı anda paylaşımlı kilit tutabilir.
- Özel (X) kilit, yazmalar için kullanılır. Bunu yalnızca bir işlem tutabilir ve satır üzerindeki diğer tüm kilitleri engeller.
Kural şudur: S, S ile uyumludur; X ise hiçbir kilitle uyumlu değildir. Yazma işlemi, tüm okuma işlemlerinin bitmesini beklemeli; okuma işlemleri de yazma işlemini beklemelidir.
SELECT FOR UPDATE ile Açık Kilitleme
Yalnızca okuduğunuz satırlar için yazma kilidi talep ederek siz işlem yapmadan önce başkalarının bu satırları değiştirmesini önleyebilirsiniz. Bu, okuma-değiştirme-yazma döngülerinde kaybolan güncellemeleri önlemenin standart yoludur.
SELECT ... FOR UPDATE özel satır kilitleri alır; satırlar siz COMMIT veya ROLLBACK yapana kadar kilitli kalır.
BEGIN;
-- lock the row so no one else can modify it concurrently
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT; -- lock released hereKilitlenme Nedir
Bir kilitlenme, iki veya daha fazla işlemin birbirinin ihtiyaç duyduğu bir kilidi tutması ve hiçbirinin ilerleyemediği bir döngü oluşturmasıyla meydana gelir.
Ders kitaplarındaki örnek şudur: T1 önce A satırını kilitler, ardından B satırını ister; T2 önce B satırını kilitler, ardından A satırını ister. Her biri diğerini sonsuza kadar bekler.
Veritabanları bunu bir bekleme grafiği kullanarak tespit eder. Bir döngü bulunduğunda altyapı bir kurban işlemi seçip iptal eder ve diğerlerinin devam edebilmesi için bir kilitlenme hatası döndürür.
Kilitlenme: Zaman Çizelgesi
Kilit alma sırasının kesişmesine dikkat edin. T1, 1. satırı alıp 2. satırı ister; T2, 2. satırı alıp 1. satırı ister. Hiçbiri kilidi bırakmadığından altyapı birini iptal eder.
İptal edilen işlem deadlock detected benzeri bir hata görür ve yeniden denemelidir. Kalan işlem normal şekilde COMMIT eder.
-- T1 | -- T2
BEGIN; | BEGIN;
UPDATE accounts SET balance=balance-10 | UPDATE accounts SET balance=balance-10
WHERE id=1; -- locks row 1 | WHERE id=2; -- locks row 2
UPDATE accounts SET balance=balance+10 | UPDATE accounts SET balance=balance+10
WHERE id=2; -- waits for T2 | WHERE id=1; -- waits for T1 -> CYCLE
-- one transaction is chosen as victim and rolled backKilitlenmeleri Önleme
Kilitlenmeleri tamamen ortadan kaldıramazsınız, ancak onları seyrek hâle getirebilirsiniz. Standart mülakat yanıtları şunlardır:
- Tutarlı kilit sıralaması: Satırları her zaman aynı sırada (örneğin artan kimlik numarasına göre) kilitleyin. Bu, döngüyü kırar.
- İşlemleri kısa tutun: Kilitleri mümkün olduğunca kısa süre tutun.
- Güvenliyse yalıtımı düşürün: Daha az kilit, daha az çakışma demektir.
- Yeniden deneme mantığı ekleyin: Kurban işlemler otomatik olarak yeniden denenmelidir.
Tutarlı sıralama, en etkili tek çözümdür ve mülakatçıların ilk olarak duymak istediği yanıttır.
Kilit Ayrıntı Düzeyi
Kilitler farklı kapsamlarda alınabilir; bu, eşzamanlılık ile ek yük arasında bir ödündür:
- Satır düzeyi kilitler yüksek eşzamanlılık sağlar, ancak yönetilmeleri daha maliyetlidir.
- Sayfa veya tablo kilitlerinin takibi daha ucuzdur, ancak daha fazla işlemi engeller.
Bazı altyapılar, bir işlem çok fazla satıra eriştiğinde satır kilitlerinden tablo kilitlerine yükseltme yapar (kilit yükseltme). Bunu bilmek, büyük bir toplu UPDATE işleminin neden aniden herkesi engelleyebildiğini açıklar.
MVCC: Anlık Görüntü Yaklaşımı
MVCC (Çok Sürümlü Eşzamanlılık Denetimi), Postgres, Oracle ve InnoDB'nin çoğu okuma kilidinden kaçınmasını sağlayan yöntemdir. Veritabanı kilitleme yerine her satırın birden çok sürümünü tutar.
En önemli faydası ve mülakatlarda sık kullanılan kısa ifade şudur: Okuma işlemleri yazma işlemlerini, yazma işlemleri de okuma işlemlerini engellemez.
Her işlem belirli bir zaman noktasındaki tutarlı bir anlık görüntüyü görür; yazma işlemleri ise satırın üzerine doğrudan yazmak yerine yeni satır sürümleri oluşturur.
MVCC Arka Planda Nasıl Çalışır
Bir satır güncellendiğinde MVCC bir yeni sürüm yazar ve eski sürümü tutar. Her sürüm, görünür hâle geldiği ve yerinin başka bir sürüm tarafından alındığı zamanı belirten işlem kimliği meta verilerini (xmin ve xmax) taşır.
Bir işlemin anlık görüntüsü, hangi sürümü göreceğine karar verir. Hiçbir işlemin artık göremediği eski sürümler ölü demetlere dönüşür ve daha sonra bir temizleme süreci tarafından geri kazanılır. Postgres'te bu süreç VACUUM'dur; bunu çalıştırmamak, sık sorulan bir devam sorusu olan tablo şişmesine yol açar.
Kilitleme ve MVCC: Ödünler
Karşılaştırmayı özlü biçimde özetleyin:
- Salt kilitleme: Doğruluğu sağlaması basittir, ancak okuma ve yazma işlemleri birbirini engeller ve eşzamanlılığı düşürür.
- MVCC: Okuma eşzamanlılığı mükemmeldir ve okuma kilitleri kullanılmaz; ancak bunun bedeli sürüm depolama ve temizleme (VACUUM, şişme) maliyetidir ve yazma-yazma çakışmaları için hâlâ kilit gerekir.
MVCC kullanan altyapılar bile yazma işlemlerinde kilit kullanır: Aynı satırı güncelleyen iki işlem sıraya girmelidir. MVCC, okuma-yazma çekişmesini ortadan kaldırır; yazma-yazma çekişmesini değil.
İyimser Kilitleme ve Sürüm Sütunları
Altyapı düzeyindeki MVCC'nin yanı sıra uygulamalar, uzun kullanıcı oturumlarındaki oku-değiştir-yaz işlemleri için sıklıkla iyimser kilitleme de ekler. Bir version sütunu ekler, bu sütunu okur ve güncelleme sırasında sürümün eşleşmesini zorunlu kılıp sürümü artırırsınız.
Başka bir işlem satırı önce güncellediyse sürüm artık eşleşmez, hiçbir satır etkilenmez ve kodunuz satırı yeniden yükleyip yeniden denemeniz gerektiğini anlar. Kullanıcı düşünürken hiçbir kilit tutulmadığından eşzamanlılık yüksek kalır. Mülakatçılar bunu "iki kullanıcı aynı kaydı düzenlerken bunu nasıl ele alırsınız?" sorusuna verilen yanıt olarak beğenir.
-- read: SELECT id, data, version FROM items WHERE id = 1; -- version = 7
UPDATE items
SET data = 'new value', version = version + 1
WHERE id = 1 AND version = 7;
-- if rows affected = 0, someone else changed it: reload and retryHızlı Kontrol
MVCC'nin temel özlü ifadesini sınayın.
Özet: Kilitler, Kilitlenmeler ve MVCC
Artık yalıtımın arkasındaki mekanizmaları açıklayabilirsiniz:
- Paylaşımlı/özel kilitler erişimi düzenler;
SELECT FOR UPDATEaçık yazma kilitleri alır. - Kilitlenmeler kilit döngüleridir; altyapı bir kurban işlemi iptal eder ve tutarlı kilit sıralaması bunların çoğunu önler.
- MVCC, okuma ve yazma işlemlerinin birbirini engellememesi için satır sürümlerini tutar; bunun bedeli temizleme işlemidir (VACUUM, şişme).
Bu mekanizmaları önceki derslerdeki yalıtım düzeyleri ve anomalilerle bir arada ele alırsanız, eşzamanlılık mülakatını baştan sona yürütebilirsiniz.
Sıkça Sorulan Sorular
“Kilitlenmeler, Kilitleme ve MVCC” dersi ücretsiz mi?
Evet — “Kilitlenmeler, Kilitleme ve MVCC” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.
“Kilitlenmeler, Kilitleme ve MVCC” dersinde ne öğreneceğim?
Veritabanlarının çakışmaları nasıl önlediği ve kilitleme ile anlık görüntü arasındaki ödünleşimler. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Kilitlenmeler, Kilitleme ve MVCC” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- ACID Özelliklerini Açıklama
- Dört Yalıtım Düzeyi
- Kirli, Tekrarlanamayan ve Hayalet Okumalar
- Kilitlenmeler, Kilitleme ve MVCC