# İyimser Kilitleme

Adres: https://softwaredictionary.org/tr/terimler/optimistic-locking
Kategori: Veritabanları
Son güncelleme: 2026-09-30
İngilizcesi: Optimistic Locking

Kısaca: İyimser kilitleme, transaction'ları kilit tutmadan ilerleten ve çakışmaları kayıt anında sürüm numarasına bakarak yakalayan bir eşzamanlılık tekniğidir.

## İyimser kilitleme (optimistic locking) nedir?

İyimser kilitleme, yazarlar arasındaki çakışmaların nadir olduğunu varsayar. Biri çalışırken bir kaydı kilitlemek yerine her kayıt bir sürüm numarası ya da zaman damgası taşır. Değişiklik kaydedilirken veritabanı, sürümün hâlâ okunan sürüm olup olmadığını kontrol eder; bu arada başkası kaydettiyse güncelleme reddedilir.

Pratikte bir satırı sürümüyle birlikte, diyelim sürüm 3, okursunuz. Daha sonra `UPDATE ... SET ..., version = 4 WHERE id = 7 AND version = 3` gibi bir güncelleme çalıştırır ve kaç satırı değiştirdiğine bakarsınız. Bir satır, kaydın başarılı olduğu anlamına gelir; sıfır satır ise başka bir yazarın önce davrandığı anlamına gelir, bu yüzden uygulama veriyi yeniden yükler ve yeniden dener ya da kullanıcıya bir çakışma gösterir. Birçok ORM bunu özel bir sürüm sütunuyla destekler; HTTP API'leri de aynı fikri `ETag` ve `If-Match` başlıklarıyla kullanır ve sürüm eskimişse `412 Precondition Failed` yanıtı verir.

Paylaşımlı bir wiki sayfasını düzenlemeye benzer: özgürce düzenlersiniz, ancak kaydet'e bastığınızda wiki, sayfayı açtığınızdan beri birinin daha yeni bir sürüm kaydedip kaydetmediğini kontrol eder ve kaydettiyse sizden birleştirme yapmanızı ister. Bu onu, kullanıcının bir kaydı düzenlemek için dakikalar harcayabileceği web formları, REST API'leri ve bir veritabanı kilidini bu kadar uzun tutmanın pratik olmayacağı dağıtık sistemler için uygun kılar.

İyimser kilitleme genellikle, satırı önceden, örneğin `SELECT ... FOR UPDATE` ile kilitleyen ve diğer yazarların beklemesini sağlayan kötümser kilitlemeyle karşılaştırılır. Kötümser kilitleme çakışmaların sık olduğu ya da yeniden denemenin pahalı olduğu durumlara uygundur; iyimser kilitleme ise beklemeyi ve kilitle ilgili deadlock'ları önler, ancak çakışmalar gerçekten olduğunda işi boşa harcar. İkisi de, bir yazarın diğerinin değişikliğinin üzerine sessizce yazdığı bir yarış durumu olan kayıp güncellemeyi (lost update) önler.

## Önemli noktalar

- Her satır, her güncellemede kontrol edilen bir sürüm numarası taşır.
- Sıfır satırla eşleşen bir güncelleme çakışma anlamına gelir.
- Kullanıcı ya da program veri üzerinde çalışırken kilit tutulmaz.
- Web formları ve API'ler gibi düşük çakışmalı iş yüklerine uygundur.
- Çakışmaların sık olduğu durumlarda alternatif kötümser kilitlemedir.

## Örnek: Güncellemede sürüm kontrolü

```sql
-- 1. Read the row and remember its version
SELECT id, title, version FROM articles WHERE id = 7;
-- => title = 'Old title', version = 3

-- 2. Save only if nobody changed the row in the meantime
UPDATE articles
SET title = 'New title', version = version + 1
WHERE id = 7 AND version = 3;

-- 3. If 0 rows were updated, someone else saved first:
--    reload the row and retry, or show the user a conflict.
```

## Sık sorulan sorular

**İyimser ve kötümser kilitleme arasındaki fark nedir?**

Kötümser kilitleme veriyi değiştirmeden önce kilitler; bu yüzden diğer yazarlar beklemek zorundadır. İyimser kilitleme ise önceden kilit almaz ve çakışmaları kayıt sırasında tespit eder; bu yüzden yazarlar hiç beklemez ama bazen yeniden denemek zorunda kalır.

**İyimser kilitleme bir çakışma tespit ettiğinde ne olur?**

Güncelleme hiçbir satırı etkilemez ya da ORM bir çakışma hatası fırlatır. Uygulama daha sonra en son veriyi yeniden yükler ve değişikliği otomatik olarak yeniden dener ya da kullanıcıdan gözden geçirmesini ister.

**İyimser kilitleme hiç veritabanı kilidi kullanır mı?**

Tek `UPDATE` ifadesi çalışırken veritabanı yine de satırı kısa süreliğine kilitler. İyimser kilitlemenin kaçındığı şey, veriyi okumakla kaydetmek arasındaki tüm süre boyunca kilit tutmaktır.

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
