Yanıtlar:
Aynı şeydir. İfadeyi kullanırsanız, set transaction isolation level
bağlantıdaki tüm tablolar için geçerli olacaktır, bu nedenle yalnızca nolock
bir veya iki tabloda a istiyorsanız bunu kullanın; aksi takdirde diğerini kullanın.
Her ikisi de size kirli okumalar verecektir. Eğer bunda sorun yoksa, onları kullan. Kirli okumalara sahip olamıyorsanız, bunun yerine düşünün snapshot
veya serializable
ipuçlarını alın.
WITH (NOLOCK), masa seviyesinde bir ipucudur. İşlem yalıtım düzeyini READ_UNCOMMITTED olarak ayarlamak bağlantıyı etkiler. Fark, kapsam açısından. Buradaki SQL Server belgelerinde READUNCOMMITTED ve NOLOCK'a bakın:
http://technet.microsoft.com/en-us/library/ms187373.aspx
İŞLEM İZOLASYON SEVİYESİ için: http://technet.microsoft.com/en-us/library/ms173763.aspx
Yönergelere gelince ... StackOverflow ve elektrik ağından rastgele bir arama ...
Bildiğim kadarıyla tek fark, Strommy'nin dediği gibi etkilerin kapsamı. Bir masada NOLOCK ipucu ve oturumda READ UNCOMMITTED.
Ortaya çıkabilecek sorunlara gelince, her şey tutarlılıkla ilgilidir. Eğer umursuyorsanız, yanlış bilgiler üzerinde manipüle edilen diğer verileri etkileyebilecek kirli okumalar alabileceğinizi unutmayın.
Şahsen bundan herhangi bir sorun gördüğümü sanmıyorum, ancak bu daha çok nolock'u nasıl kullandığımdan kaynaklanıyor olabilir. Kullanmanın uygun olacağı senaryolar olduğunun farkında olmalısınız. Çoğunlukla bir tabloya yeni veri eklediğiniz, ancak bir veri senaryosunu kontrol etmek için arkasında gelen başka bir işlemin olduğu senaryolar. Ana akış, bir okuma sırasında geri dönmeyi ve satırları güncellemeyi içermediğinden, bu muhtemelen tamam olacaktır.
Ayrıca, bu günlerde Çok Sürümlü Eş Zamanlılık Kontrolü'ne bakmanız gerektiğine inanıyorum. 2005 yılında eklediklerine inanıyorum ve okuyucuların kullanmaları için veritabanının anlık görüntüsünü vererek yazarların okuyucuları engellemesini engellemeye yardımcı oluyor. Bir bağlantı ekleyeceğim ve okuyucuya daha fazla araştırma bırakacağım:
Her tablo için WITH (NOLOCK) kullanmanız gerektiğinden, bunu her FROM veya JOIN tümcesine yazmak can sıkıcı olabilir. Ancak buna "kirli" okuma denmesinin bir nedeni vardır. Yani ne zaman yapacağınızı gerçekten bilmeli ve bunu oturum kapsamı için varsayılan olarak ayarlamamalısınız. Neden?
Unutmak bir İLE (nolock) Eğer nerde ancak kirli okumak yapıyor, çok dramatik bir şekilde programınızı etkilemez olabilir değil bir belirli durumlarda fark yaratabilir istiyorum.
Bu nedenle, seçilen mevcut verilerin yanlış olmasına izin veriliyorsa, daha sonra geri alınabileceği için WITH (NOLOCK) kullanın. Bu, çoğunlukla performansı artırmak istediğinizde kullanılır ve uygulamanızın bağlamındaki gereksinimler, tutarsız verilerin görüntülenmesi riskini almasına izin verir. Bununla birlikte, siz veya sorumlu bir kişi WITH (NOLOCK) kullanma kararının artılarını ve eksilerini tartmanız gerekir.
REPEATABLE READ
bunun yerine düşününSERIALIZABLE
.SERIALIZABLE
GERÇEKTEN kısıtlayıcıdır ve neredeyse hiçbir zaman kullanılmamalıdır (örneğin, bazı kritik finansal uygulamalar dışında).