SET İŞLEM İZOLASYON DÜZEYİNİN YARARLARI OKUYUN FAYDALI


12

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDGenel SQL sorgularımın çoğunda kullanıyorum , çünkü bu aslında dili öğrenirken bana verildi.

Anladığım kadarıyla, bu izolasyon seviyesi, WITH (NO LOCK)sadece benim kullanma eğilimimdeki gibi davranıyor SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

  • Kullandığım gerektiğini bir kez hiç var mı WITH (NO LOCK)üzerinde SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
  • Does SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDOkuyorum o tablolar dışarıda kalmasını durak diğer kullanıcıları?
  • Eğer SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDdurdurma kilitler için kullanılır, ama sadece verileri okuyorum, bunu kullanarak ne anlamı var? Kilit oluşturan sadece sistem yoğun sorgular mı? 5-10 saniye içinde dönecek sorgular çalıştırırken kullanmaya değer mi?
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDGüncellemelerde kullanılacak verileri okurken, muhtemelen kirli verileri güncellemekten kaçınmak için kullanmamam söylendi . Tek sebep bu muydu?
  • Üzerinde çalıştığım veritabanı türü ile bir üretim ve test ortamı var. Çok nadiren üretim ortamını sorgulayacağız, ancak ihtiyacım olduğunda genellikle sorgumda kullanacağım SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. Bununla kirli okumaların mümkün olduğunu anlıyorum. Veritabanına bağlı kalmayabilecek (ve dolayısıyla sonuçlarımı dışarı atabilecek) verileri geri almanın yanı sıra, başka ne tür 'kirli okumalar' mümkün olabilir?

Kitlesel sorular için özür dilerim.


2
Aynı verileri iki kez okuyabilirsiniz başka bir çukur düşme. Standart olarak RU veya NO LOCK kullanmak kötü bir fikirdir.
James Anderson

9
Her READ UNCOMMITTEDyerde, her yerde kullanmamam gibi aynı şekilde kullanmam WITH (NOLOCK)(esasen aynı şeydir) blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
Mark Sinkinson

1
SNAPSHOT izolasyon modellerine bakın. RCU'dan çok daha güçlüdürler ve ayrıca engellemez veya engellemeye neden olmazlar. Sizin için iyi bir varsayılan model gibi geliyorlar (RCU'ya varsayılan olmak yerine!).
usr

Yanıtlar:


26

Bu şekilde öğrendiğiniz çok korkunç (üzgünüm!).

READ UNCOMMITTEDher satırı okuyalım, evet. Hatta bu anda bir kullanılırlar kim INSERT, UPDATE, DELETEoperasyon. Bu, bazı Verilere hızlı bir şekilde bakmanız veya kritik bir SELECTgörevde -Bir bloğun çok zararlı olacağı durumları - incelemeniz gerekiyorsa çok yararlıdır.

Aslında bütünlüğünüzü riske atıyorsunuz. Şu anda silinmek veya değiştirmek için kullanılan bir satırı okumanız gerekebilir. Yanlış bir değer okuduğunuz da görünebilir. Bu gerçekten nadir olabilir, ancak olabilir. Bununla ne demek istiyorum? Çok geniş bir satır düşünün (birçok uzun sütunlu birçok sütun vardır nvarchar). Bu satırda bir güncelleme gerçekleşir ve yeni değerler ayarlanır. Nadir durumlarda, sadece yarım satır okumanız başınıza gelebilir. Örneğin, bir kullanıcı giriş değerlerini değiştirirse başka bir şey olabilir. Posta + şifresini değiştirir. Posta zaten ayarlanmış, ancak şifre ayarlanmamış. Bu şekilde tutarsız bir durumunuz olur.

Unutmayı öneririm READ UNCOMMITTED. Sadece gerçekten ihtiyaç duyulan yerlerde kullanın .

Sizin için başka bir alternatif, READ_COMMITTED_SNAPSHOTveritabanı seçeneğini etkinleştirmek olabilir - bu nedenle READ COMMITTED SNAPSHOTtempdb'nizdeki etkin satır sürümü nedeniyle kullanabilirsiniz . Bu şekilde bir satırın başka bir (eski) sürümünü okursunuz. Bu, Sorgularınızı engellemez. Ancak, eski bir değeri de, tutarlı bir eski değeri okuduğunuz ortaya çıkabilir.

WITH(READPAST)Bunun yerine başka bir fikir olabilir WITH(NOLOCK). Tablonun eski durumunu (içinde olduğu gibi SNAPSHOT ISOLATION) okuyacaksınız , ancak o anda kilitli olan tüm satırları atlayacaksınız.


@Ionic, cevap için çok teşekkür ederim! Bu konudaki yardımı gerçekten takdir ediyorum.
dmoney

@HingeSight, kulağa hoş geliyor, ancak ifadeyi yorumlamam çok iyi bir şans var, her iki giriş için de teşekkürler.
dmoney

1
SNAPSHOT ISOLATIONaçmak için etkinleştirilmesi gerekmez READ COMMITTED SNAPSHOT. Yalnızca READ COMMITTED SNAPSHOTveritabanı seçeneğinin etkinleştirilmesi gerekir, böylece okuma tutarlılığı için kilitleme yerine satır sürümleme, kirli okumalara gerek kalmaz.
Dan Guzman

Evet, @DanGuzman demek istedim. Maalesef cevap bu noktada biraz belirsizdi. Ben düzenledim. :-)
Ionic

READPAST ile kilitli kayıtları atlayacaksınız, eski değerleri alamayacaksınız - bu yüzden kullanabileceğimi anladığım tek yer kuyruk işleme
James Z

2

Kabul edilen yanıtın belirttiği gibi, yanlış verileri okuma riskiyle karşılandığınızda (gerçekten gerekli olanlar hariç) UNCOMMITTED izolasyon düzeyini OKUYUN. Ancak sorunuzun 3. madde işaretine cevap vermek için yararlı bulduğum iki durum var:

  1. SQL Server SSIS paketlerini yazarken ve test ederken, paketin adımları bir işleme sarılabilir. Bir paketi SSIS hata ayıklayıcısında adım adım çalıştırarak test ediyorsanız, tabloda kilitler varken tabloları incelemek isteyebilirsiniz. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED kullanılması, paket hata ayıklanırken tabloları incelemek için SQL Server Manager Studio'yu kullanmanızı sağlar.

  2. SQL Server Manager Studio'da, değişiklikleri geri alma seçeneği sunmak için T-SQL kodunu bir işlemde sararak test etmek isteyebilirsiniz. Örneğin, bir test veritabanında, testinizin bir parçası olarak verileri ilk durumuna geri yüklemek isteyebilirsiniz. İşlemle sarılmış kodu test ediyorsanız ve işlem devam ederken kilitli tabloları denetlemek istiyorsanız, başka bir penceredeki değerleri incelemek için İŞLEM İZOLASYON SEVİYESİ SEVİYESİNİ OKUYUN seçeneğini kullanabilirsiniz.

Bunların READ UNCOMMITTED için oldukça belirsiz kullanımları olduğunu kabul ediyorum, ancak bunları bir test ortamında yararlı buldum.


1

Çoğu veritabanında, etkinliğin büyük çoğunluğu, ekler, siler ve güncellemeler bile açık işlemlerin dışındadır.

Elbette, READ UNCOMMITTED(Kirli Okumalar) bu durumlarda yanlış bilgi sağlayabilir, ancak bu bilgi 5 saniye önce DÜZELTİLMİŞTİR.

Kirli Okumaların gerçekten kötü sonuçlar ürettiği zamanlar, bir İşlemin başarısız olduğu ve geri alınması gerektiğinde veya normalde açık bir işlem kullanılarak birlikte güncellenen iki tabloya karşı bir sorgu çalıştırıldığında ortaya çıkar.

Bu arada, 100 (veya daha fazla) ile yazma arasında okuma / yazma oranı olan tipik büyük, meşgul bir veritabanında, Dirty Reads kullanmayan HER tek (okuma) sorgu sistemi yavaşlatıyor, çünkü edinmesi ve kontrol etmesi gerekiyor kilitler için VE daha ciddi veritabanı bütünlüğü sorunlarına neden olabilecek işlemlerin başarısız olma olasılığını arttırır (genellikle Deadlocks nedeniyle).

Bunun yerine, kirli okumaların kullanılması sistemi ÇOK daha hızlı ve daha güvenilir hale getirir (kısmen performansın artması nedeniyle tutarsızlıkların oluşma olasılığını azaltır).

Tabii, kullanılmaması gereken zamanlar var. READ UNCOMMITTEDIzolasyon düzeyini kullanarak veya hatta SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSQL Scripts ve SP'lerin başlangıcında açık ifade kullanarak varsayılan olarak veritabanı ayarlamak sevmiyorum - bir Kirli Okuma olmamalı zaman çok fazla şansı var. Bunun yerine, (NOLOCK)ipuçları programcının ne yaptığını açıkça düşündüğünü ve bu özel sorgudaki bu özel tablo için Kirli Okumaların güvenli olduğuna karar verdiklerinden, ipuçlarını çok daha iyi bir yaklaşımdır.

Bir banka hesabından diğerine para aktarmak için bir uygulama programlıyorsanız, Dirty Reads kullanmamalısınız. Ancak çoğu uygulamanın bu düzeyde paranoyaya ihtiyacı yoktur.

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.