Çatışmalarla uğraşırken iki seçeneğiniz vardır:
- Çatışmayı önlemeye çalışabilirsiniz, Kötümser Kilitlemenin yaptığı da budur.
- Ya da, çatışmanın gerçekleşmesine izin verebilirsiniz, ancak işlemlerinizi gerçekleştirdikten sonra bunu tespit etmeniz gerekir ve bu da İyimser Kilitlemenin yaptığı şeydir.
Şimdi, aşağıdaki Kayıp Güncelleme anomalisini ele alalım :
Kayıp Güncelleme anormalliği Okunan Taahhütlü yalıtım düzeyinde olabilir.
Yukarıdaki şemada Alice'in 40'ı ondan çekebileceğine inandığını account
ancak Bob'un hesap bakiyesini yeni değiştirdiğini fark etmediğini görebiliyoruz ve şimdi bu hesapta sadece 20 tane kaldı.
Kötümser Kilitleme
Kötümser kilitleme, bu hedefe hesap üzerinde paylaşılan veya okunan bir kilit alarak ulaşır, böylece Bob'un hesabı değiştirmesi önlenir.
Yukarıdaki şemada, hem Alice hem de Bob, her account
iki kullanıcının da okuduğu tablo satırında bir okuma kilidi edinecek . Veritabanı, Tekrarlanabilir Okuma veya Serileştirilebilir kullanırken SQL Server'da bu kilitleri alır.
Hem Alice hem de Bob account
, PK değeri ile okuduğu için 1
, ikisi de bir kullanıcı okuma kilidini bırakana kadar değiştiremez. Bunun nedeni, bir yazma işleminin bir yazma / özel kilit edinimi gerektirmesidir ve paylaşılan / okuma kilitleri yazma / özel kilitleri önler.
Ancak Alice işlemi gerçekleştirdikten ve account
satırdaki okuma kilidi serbest bırakıldıktan sonra , Bob UPDATE
değişikliği sürdürecek ve uygulayacaktır. Alice okuma kilidini bırakana kadar Bob'un GÜNCELLEME bloke eder.
Veri erişim çerçevelerinin temel veritabanı kötümser kilitleme desteğini nasıl kullandığı hakkında daha fazla bilgi için bu makaleye göz atın .
İyimser Kilitleme
İyimser Kilitleme, çatışmanın gerçekleşmesine izin verir, ancak sürüm değiştikçe Alice'in UPDATE'ini uyguladıktan sonra algılar.
Bu sefer ek bir version
sütun daha var. version
Sütun her seferinde bir UPDATE artırılır veya DELETE yürütüldüğünde ve ayrıca UPDATE ve DELETE deyimleri WHERE cümleciği kullanılır. Bunun çalışması için, version
GÜNCELLEME veya SİL'i çalıştırmadan önce SELECT'i seçmeli ve akımı okumalıyız, aksi halde WHERE yan tümcesine veya artışına hangi sürüm değerinin geçeceğini bilemeyiz.
Veri erişim çerçevelerinin iyimser kilitlemeyi nasıl uyguladığı hakkında daha fazla bilgi için bu makaleye göz atın .
Uygulama düzeyinde işlemler
İlişkisel veritabanı sistemleri, bir müşterinin tipik olarak bir terminal aracılığıyla bir ana kareye bağlanacağı 70'li yılların sonlarında ortaya çıktı. Bu yüzden hala veritabanı sistemlerinin OTURUM ayarı gibi terimler tanımladığını görüyoruz.
Günümüzde, internet üzerinden artık aynı veritabanı işlemi bağlamında okuma ve yazma işlemleri gerçekleştirmiyoruz ve ACID artık yeterli değil.
Örneğin, aşağıdaki kullanım durumunu göz önünde bulundurun:
İyimser kilitleme olmadan, veritabanı işlemleri Serializable kullansa bile bu Kayıp Güncellemenin yakalanmasının bir yolu yoktur. Bunun nedeni, okuma ve yazma işlemlerinin ayrı HTTP isteklerinde, dolayısıyla farklı veritabanı işlemlerinde yürütülmesidir.
Bu nedenle, iyimser kilitleme, kullanıcı düşünme süresini de içeren uygulama düzeyinde işlemleri kullanırken bile Kayıp Güncellemeleri önlemenize yardımcı olabilir.
Uygulama düzeyinde veya mantıksal işlemler hakkında daha fazla bilgi için bu makaleye göz atın .
Sonuç
İyimser kilitleme çok kullanışlı bir tekniktir ve Okuma Taahhütlü gibi daha az katı yalıtım düzeyleri kullanıldığında veya sonraki veritabanı işlemlerinde okuma ve yazma yürütüldüğünde bile iyi çalışır.
İyimser kilitlemenin dezavantajı, yakalama üzerine veri erişim çerçevesi tarafından bir geri dönüşün tetiklenmesidir OptimisticLockException
, bu nedenle daha önce yürütülmekte olan işlem tarafından daha önce yaptığımız tüm işleri kaybeder.
Daha fazla çekişme, daha fazla çatışma ve işlemleri iptal etme şansı artar. Geri almalar, hem tablo satırlarını hem de dizin kayıtlarını içerebilecek tüm geçerli bekleyen değişiklikleri geri alması gerektiğinden veritabanı sistemi için maliyetli olabilir.
Bu nedenle, çatışmalar sık sık meydana geldiğinde kötümser kilitleme cevheri uygun olabilir, çünkü işlemlerin geri alınma şansını azaltır.