(NOLOCK) ile İŞLEM İZOLASYON SEVİYESİNİ AYARLA OKUMADAN OKUMA


118

Birisi bana kullanmalıyım zaman hakkında bir fikir vermek Could WITH (NOLOCK)aksineSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Her birinin artıları / eksileri nelerdir? Birini diğerinin aksine kullanırken karşılaştığınız istenmeyen sonuçlar var mı?

Yanıtlar:


105

Aynı şeydir. İfadeyi kullanırsanız, set transaction isolation levelbağlantıdaki tüm tablolar için geçerli olacaktır, bu nedenle yalnızca nolockbir 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 snapshotveya serializableipuçlarını alın.


Hayali verileri umursamıyorsanız REPEATABLE READbunun yerine düşünün SERIALIZABLE. SERIALIZABLEGERÇEKTEN kısıtlayıcıdır ve neredeyse hiçbir zaman kullanılmamalıdır (örneğin, bazı kritik finansal uygulamalar dışında).
Kryptos


10
  • NOLOCK, tablo (veya görünümler vb.) İçin yereldir
  • READ UNCOMMITTED, oturum / bağlantı başına

Yönergelere gelince ... StackOverflow ve elektrik ağından rastgele bir arama ...


Son bağlantı "NOLOCK kullanımı neden kötü .." artık mevcut değil.
sangam

1
elektrik ağı paha biçilemez. günüme biraz güneş ışığı kattığın için teşekkürler.
JJS

9

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:

MVCC

Veritabanı İzolasyon Düzeyleri


+1 READ_UNCOMMITTED'in "sen yapmalısın" yönüne girmemiş olsam da, Sean bunu güzelce ele alıyor. Aynı satırı SQL Server'da iki kez okuyabileceğiniz durumlar da var (sayfa bölünmeleri nedeniyle).
Anon246

6

Bir Görünümde Set Transaction Isolation Level Read Uncommitted'ı kullanamazsınız (aslında orada sadece bir komut dosyası olabilir), bu nedenle kirli satırlar dahil edilecekse (nolock) kullanmanız gerekir.


4

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.