, bu fikrinizi etrafında sarmak için şaşırtıcı derecede zor bir konu olabilir.
ederim Hugo Kornelis (SQL Server MVP) tarafından bu series of posts on snapshot isolation okumanızı öneririz. Şimdilik enstantane fotoğraflarını kullanırken, pratik ile ilgili olarak gördüğüm en eksiksiz analiz.
- eşzamanlı işlemlerin belirli bir kombinasyonun mümkün (UNIQUE, YABANCI KEY, vs.) bir kısıtlamayı ihlal etmek yapacak, SQL Server eski haline geri düşecek: ana konularını özetlemek gerekirse bir şeyler yapmak. Bu, güvenilirlik için iyidir, açıkçası, ancak performans için değil. Anlık görüntüler her derde deva değil, iyi bir veritabanı/sorgu tasarımı ve akıllı kilit yönetimi için yedek değiller.
- Anlık görüntüler ve tetikleyiciler birlikte iyi çalınamayabilir. Veri bütünlüğünü korumak için tetikleyicileri kullanırsanız özellikle tehlikelidir, ancak bunu yapmasanız bile, tüm tetikleyicilerinizin anlık görüntüsünün farkında olması gerekir.
Sorgularınızı nasıl yazdığınıza bağlı olarak, unexpected or inconsistent results ile sonuçlanmak için tetikleyiciler kullanmanız gerekmeyebilir.
Kesinlikle geometrik olmadıkları halde maliyetlerin sabit mi yoksa doğrusal mı olduğunu bilmiyorum; Bunun bir baş ağrısı olduğunu bilmiyorum. Sık sık bir yangın-ve-bir-seçenek olarak konuşulur, ama gerçek şu ki, ne yaptığınızı bilmiyorsanız, ne yapacağınızı bilmiyorsanız, (belki de muhtemelen bu konuda hiçbir şey öğrenmeyeceksiniz) çok geç olana kadar!).
Hiçbir şekilde, başka bir soruna neden olmayacağından eminseniz kullanın.Fakat mantığınızdan herhangi biri kirli okumalarla ilgilenmiyorsa (ve bu, birçok sistemde SELECT
sorgusunun yarısından fazlası için geçerlidir), daha fazla "uzmanlık" ile ilgili olan daha iyi sonuçlar elde edeceksiniz (READ UNCOMMITTED
). ne olabileceğini ve ne zaman olabileceğini çok dikkatli düşünün).
Güncelleme: uygulama düzeyinde alternatifleri
günü akla tek önbelleklemesidir. Bazı veri çerçeveleri bunu sizin için yapabilir (NHibernate, EF) ve bazı durumlarda, ileti girdisine göre sonuçları önbelleğe alan web hizmetleri gibi çeşitli önbellekleme seçeneklerine sahip olabilirsiniz. Buna gerçekten bir "alternatif" demeyeceğim, ancak birer önbellekleme biçiminin, salt okunur sorgularsa ve altta yatan veriler sık sık değişmiyorsa sizin durumunuzda etkili olacağını hayal ediyorum. Tasarım düşüncesi, tabi ki, ne kadar veriye sahip olmanız gereken miktarla ilgili önbelleğe para verebileceğinizi; Sistem büyük ölçüde eşzamanlıysa, o zaman bu ölçek olmayabilir. Bunun ötesinde, kişisel olarak kendi uygulama düzeyindeki işlemsel "katmanım" ı uygulamaya çalışmayı seçmeme gerek kalmayacaktı. Belki bazı insanlar bunu yapmıştır, ancak sınırlı deneyimimin, DBMS üzerinde 20 yıldır çalışan yüzlerce veya binlerce parlak tasarımcıyla rekabet edebileceğini düşünmüyorum.
Bu harika bir cevaptır. READ UNCOMMITTED'i dikkate aldık, ancak anlık görüntü yalıtımıyla çalıştığım bu sorgular salt okunur ve "insan tüketimi" için de geçerlidir - aynı işlem içinde hiçbir yazım işlemi yok. Bu nedenle, sonuç kümesi iç tutarlılığı ve kilitsiz veri parası tercih ediyorum. Bu uygun bir kullanım gibi görünüyor mu? ... ben de senin bağlantılarını okuyorum. –
Ayrıca, uygulama düzeyinde alternatifler var mı? Farklı yalıtım seviyeleri farklı sonuçlar verir, ancak uygulama düzeyinde bir model, yalnızca izinsiz görüntülerle birlikte READ COMMITTED yalıtımı kullanarak aynı yararları sağlayabilir. Ya da böyle bir ev yapımı girişimi performansı daha da kötüleştirir. –
Kanaatimce ve READ UNCOMMITTED'i öğrenmek, SADECE aşırı uç durumlarda kullanılmalıdır. READ UNCOMMITTED etrafında bir sistem inşa ederseniz, bir kabusla eğlenirsiniz, umarım kişisel verilerim sisteminizde değildir. Kullanmamak için birçok sebep var. Sadece kirli okumaların dışında tahmin edilemez sonuçlar verebilir. Kullanabileceğim tek zaman, veriyi pompalayarak devasa bir işlem yaptığım zaman ve kaç tane kayıt yaptıklarının kaba bir sayımını istiyorum. Bunu ad-hoc yapıyorum. Herhangi bir SQL Server gurubundan okumaya ve bunun hakkında ne düşündüklerine bakın. – Kuberchaun