Optimistic locking ile pessimistic locking arasındaki fark nedir?
Cevap
İki kullanıcının aynı kaydı aynı anda güncellemesi sonucu birinin değişikliğinin kaybolmasına lost update denir. İki yaklaşımla önlenir.
Pessimistic locking
"Çakışma olacak" varsayımıyla kaydı okurken kilitler; transaction bitene kadar diğerleri bekler.
BEGIN;
SELECT bakiye FROM hesaplar WHERE id = 1 FOR UPDATE; -- satır kilitlenir
UPDATE hesaplar SET bakiye = bakiye - 100 WHERE id = 1;
COMMIT;Optimistic locking
"Çakışma nadirdir" varsayımıyla kilit almaz. Bir version sütunu tutulur; güncelleme sırasında versiyonun değişmediği kontrol edilir.
-- Okurken: version = 7
UPDATE urunler
SET stok = 9, version = version + 1
WHERE id = 10 AND version = 7;
-- Etkilenen satır 0 ise başkası önce güncellemiş: yeniden oku ve tekrar deneORM'ler bunu hazır sunar (JPA @Version, Django'da elle, SQLAlchemy version_id_col).
| Pessimistic | Optimistic | |
|---|---|---|
| Mekanizma | Veritabanı kilidi | Versiyon / timestamp kontrolü |
| Çakışma sık olduğunda | İyi | Çok sayıda retry, kötü |
| Çakışma nadir olduğunda | Gereksiz bekleme | İyi, yüksek eşzamanlılık |
| Riskler | Deadlock, uzun bekleme | Retry mantığı yazılmalı |
| Uzun süren işlem (kullanıcı formu) | Uygun değil | Uygun |
Pratik kural: stok düşme, bakiye gibi kısa ve sık çakışan işlemlerde pessimistic; kullanıcının bir formu dakikalarca açık tuttuğu düzenleme ekranlarında optimistic tercih edilir. Basit sayaçlarda ise UPDATE ... SET stok = stok - 1 WHERE stok > 0 gibi atomik güncelleme çoğu zaman ikisine de gerek bırakmaz.
İlgili Veritabanı & SQL soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.