İyimser Kilitleme
- İ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
-- 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.
İlgili sayfalar
- TransactionVeritabanları, s. 36Transaction, tek bir bütün olarak başarılı ya da başarısız olan veritabanı işlemleri grubudur; böylece veri asla yarım kalmış, tutarsız bir durumda bırakılmaz.
- Yalıtım DüzeyiVeritabanları, s. 46Yalıtım düzeyi, eşzamanlı transaction'ların birbirinin değişikliklerini ne kadar görebileceğini belirleyen ve katılıkla hızı dengeleyen veritabanı ayarıdır.
- Race Conditionİşletim Sistemleri, s. 24Race condition, programın sonucunun paylaşılan veriyi aynı anda kullanan thread, process veya isteklerin öngörülemeyen zamanlamasına bağlı olduğu hatadır.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Deadlockİşletim Sistemleri, s. 7Deadlock, iki ya da daha fazla thread veya process'in kaynakları bırakmaları için birbirini sonsuza dek beklediği ve hiçbirinin ilerleyemediği durumdur.
- ORMVeritabanları, s. 24ORM, veritabanı tablolarını programlama dilinizdeki nesnelere eşleyen ve ham SQL yerine kodla veri okuyup yazmanızı sağlayan bir kütüphanedir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin