Şu sorudan yinelenen soru:
/programming/129329/optimistic-vs-pessimistic-locking
Yukarıdaki bağlantıdan yanıtı Kopyala / Yapıştır:
İyimser Kilitleme, bir kaydı okuduğunuz, sürüm numarasını not ettiğiniz ve kaydı geri yazmadan önce sürümün değişip değişmediğini kontrol ettiğiniz bir stratejidir. Kaydı geri yazdığınızda, güncellemenin atomik olduğundan emin olmak için sürüme filtre uygularsınız. (örneğin, sürümü kontrol edip kaydı diske yazdığınızda arasında güncellenmedi) ve sürümü tek bir tıklamayla güncelleyin.
Kayıt kirliyse (yani sizinkinden farklı bir sürüm) işlemi iptal edersiniz ve kullanıcı kaydı yeniden başlatabilir.
Bu strateji en çok oturumunuz için veritabanıyla bağlantı kurmanız gerekmeyen yüksek hacimli sistemler ve üç katmanlı mimariler için geçerlidir. Bu durumda, bağlantılar bir havuzdan alındığından istemci aslında veritabanı kilitlerini koruyamaz ve bir bağlantıdan diğerine aynı bağlantıyı kullanmıyor olabilirsiniz.
Kötümser Kilitleme, kaydı bitirene kadar özel kullanımınız için kilitlediğiniz zamandır. İyimser kilitlemeden çok daha iyi bir bütünlüğe sahiptir, ancak Deadlock'lardan kaçınmak için uygulama tasarımınıza dikkat etmenizi gerektirir. Kötümser kilitlemeyi kullanmak için veritabanına doğrudan bir bağlantıya (tipik olarak iki katmanlı bir istemci sunucu uygulamasında olduğu gibi) veya bağlantıdan bağımsız olarak kullanılabilen harici olarak kullanılabilen bir işlem kimliğine ihtiyacınız vardır.
İkinci durumda, işlemi TxID ile açar ve ardından bu kimliği kullanarak yeniden bağlanırsınız. DBMS kilitleri korur ve oturumu TxID üzerinden yedeklemenizi sağlar. İki aşamalı kesinleştirme protokollerini (XA veya COM + İşlemleri gibi) kullanarak dağıtılmış işlemler bu şekilde çalışır.
Düzenle (Performans sorusunu ele almak için daha fazla bilgi ekleme):
Performans akıllıca ortamınıza bağlıdır. Karar vermek için aşağıdaki faktörleri alın:
çoğu durumda eşzamanlılık nedeniyle iyimser olacaksınız. RDBMS ve ortama bağlı olarak, bu daha az veya daha fazla performans gösterebilir. Genellikle İyimser kilitleme ile değerin bir yerde satır sürümünün olması gerektiğini görürsünüz.
Örneğin MS SQL Server ile TempDB'ye taşınır ve sütunun sonuna 12-14 bayt arasında bir şey eklenir. Anlık Görüntü Yalıtımı gibi bir yalıtım düzeyiyle iyimser kilitlemeyi açmak parçalanmaya neden olabilir ve satırların artık sonunda bir sayfanın dolmasına neden olabilecek ek verilere sahip olması nedeniyle dolgu faktörünüzün ayarlanması gerekecektir. performansınız. TempDB'niz optimize edilmişse, bu o kadar hızlı olmayacaktır.
Sanırım bir kontrol listesi:
- Satır sürüm oluşturma biçimini işlemek için yeterli G / Ç kaynağınız var mı? Değilse, ek yük eklersiniz. Öyleyse, verileri sık sık yazarken kilitlerken sık sık okuyorsanız, okuma ve yazma arasındaki eşzamanlılıkta iyi bir iyileşme göreceksiniz (yazmalar hala yazmaları engellemesine rağmen, okumalar artık yazmaları engellemeyecektir)
- -Kodunuz kilitlenmelere karşı hassas mı yoksa kilitleme sorunu yaşıyor musunuz? Uzun kilitler veya çok fazla kilitlenme yaşamıyorsanız, İyimser kilitlemenin ek yükü, işleri daha hızlı yapmaz, elbette, çoğu durumda burada milisaniye konuşuyoruz.
- - DB'niz büyükse (veya çok sınırlı bir donanımda) ve RDBMS'ye bağlı olarak veri sayfalarınız dolmak üzereyse, büyük sayfa bölünmelerine ve veri parçalanmasına neden olabilir, bu nedenle açtıktan sonra yeniden dizine eklemeyi unutmayın.
Bunlar benim konu hakkındaki düşüncelerim, topluluktan daha çok şey duymaya açık.