İstemcinin veri alması ve SQL Server'a veri aldığını bildirmesi uzun zaman alırsa, SQL Server'ın beklemesi gereken bu beklemeden dolayı SQL Server, istemciden onay alınmadıkça sorgu tarafından tutulan kilitleri serbest bırakmaz.
Bu doğru değil, izolasyon seviyesine bağlıdır.
Varsayılan olarak READ COMMITTED
kilitler ifadelerin yürütülmesi süresince tutulmaz. READ COMMITTED
deyim düzeyinde okuma tutarlılığı sağlamaz, tek garanti, taahhüt edilmemiş verileri okuyamayacağınızdır. Paylaşılan bir kilit alınır ve satırı okumak için tutulur ve serbest bırakılır.
LOB tipiniz olmadığı sürece.
Potansiyel olarak çok büyük olan LOB tipleri tamponlanamaz. Paylaşılan kilit size esas veren deyim tamamlanıncaya kadar kazanılmış ve tutulmalıdır REPEATABLE READ
de davranış READ COMMITTED
.
Yüksek gecikmeli bir ağ üzerinden MSSQL veritabanına tek bir çağrı yapıyorsam, bu gecikmeler nedeniyle tablo kilitleri oluşacak mı?
Gecikme, masa kilidine neden olmaz, hayır. Ancak, bir masa kilidi edinilmişse, gecikme süresi uzatacaktır.
Bunun mekaniğini benden daha iyi bilen birini alıntılamak için ( @RemusRusanu ):
Yürütme devam ettikçe sonuçlar istemci programına geri döndürülür. Satırlar yürütme ağacını 'kabarcıkladığında', en iyi işleç genellikle bu satırları ağ arabelleklerine yazmak ve istemciye geri göndermekle görevlendirilir. Sonuç ilk önce bazı ara depolarda (bellek veya disk) oluşturulmaz ve daha sonra istemciye geri gönderilir, bunun yerine oluşturulduğu gibi geri gönderilir (sorgu yürütüldüğünde). Sonucu istemciye geri göndermek elbette ağ akış kontrol protokolüne tabidir. İstemci sonucu aktif olarak tüketmiyorsa (örneğin, SqlDataReader.Read () öğesini çağırarak), sonunda akış kontrolünün gönderen tarafı (yürütmekte olan sorgu) engellemesi gerekecektir ve bu da uygulamanın yürütülmesini askıya alacaktır. sorgu.[kaynak]
Sonuçlar, istemci veya ağ nedeniyle SQL Server'ın sunabildiği kadar hızlı tüketilmediğinde, ASYNC_NETWORK_IO
biriken beklemeleri görüyoruz . Tekrarlamak gerekirse, bu, elde edilen kilitleri değil, sadece tutuldukları süreyi etkilemez.
nolock
ipucu belirtmedikçe , her zaman bir kilit olacaktır . Gecikme, kilidin ne kadar süreyle tutulacağını belirler.