Jeśli klient długo odbiera dane i z kolei wysyła do SQL Server potwierdzenie, że je otrzymał, SQL Server musi czekać, dlatego SQL Server nie zwolni blokad blokowanych przez zapytanie, chyba że otrzyma potwierdzenie od klienta.
To nie jest dokładne, zależy to od poziomu izolacji.
Domyślnie READ COMMITTED
blokady nie są wstrzymywane na czas wykonywania instrukcji. READ COMMITTED
nie zapewnia spójności odczytu na poziomie instrukcji, jedyną gwarancją jest to, że nie można odczytać niezaangażowanych danych. Blokada współdzielona jest pobierana i utrzymywana w celu odczytania wiersza, a następnie zwolniona.
Chyba że masz typy LOB.
Typy LOB, potencjalnie bardzo duże, nie mogą być buforowane. Blokada współdzielona musi zostać nabyta i utrzymana do czasu wypełnienia oświadczenia, co zasadniczo daje ci REPEATABLE READ
zachowanie w READ COMMITTED
.
Jeśli wykonuję pojedyncze wywołanie bazy danych MSSQL w sieci o dużym opóźnieniu, czy z powodu tego opóźnienia wystąpią blokady tabeli?
Opóźnienie nie powoduje blokady stołu, nie. Jeśli jednak zostanie uzyskana blokada stołu, opóźnienie ją przedłuży.
Cytując kogoś, kto zna mechanikę tego lepiej niż ja ( @RemusRusanu ):
Wyniki są zwracane z powrotem do programu klienckiego w trakcie wykonywania. Gdy wiersze „bąbelkują” w górę drzewa wykonania, górny operator zwykle ma za zadanie zapisanie tych wierszy w buforach sieciowych i wysłanie ich z powrotem do klienta. Wynik nie jest najpierw tworzony w pamięci pośredniej (pamięci lub dysku), a następnie wysyłany z powrotem do klienta, zamiast tego jest odsyłany w trakcie tworzenia (w trakcie wykonywania zapytania). Odesłanie wyniku z powrotem do klienta jest oczywiście uzależnione od protokołu kontroli przepływu w sieci. Jeśli klient nie pobiera aktywnie wyniku (np. Przez wywołanie SqlDataReader.Read ()), to w końcu kontrola przepływu będzie musiała zablokować stronę wysyłającą (wykonywane zapytanie), a to z kolei zawiesi wykonanie pytanie.[źródło]
Tam, gdzie wyniki nie są zużywane tak szybko, jak SQL Server może je dostarczyć, czy to ze względu na klienta, czy sieć, obserwujemy ASYNC_NETWORK_IO
kumulację oczekiwań. Powtórzmy, że nie wpłynie to na zdobywane blokady, tylko na czas ich trwania.
nolock
podpowiedzi, zawsze będzie blokada . Opóźnienie określa tylko, jak długo zamek będzie trzymany.