Z (NOLOCK) vs USTAW POZIOM IZOLACJI TRANSAKCJI ODCZYT NIEZGODZONY

118

Czy ktoś mógłby mi udzielić wskazówek, kiedy powinienem używać, WITH (NOLOCK)a kiedySET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Jakie są zalety / wady każdego z nich? Czy są jakieś niezamierzone konsekwencje, na które napotkasz, używając jednego w przeciwieństwie do drugiego?

Jim B.
źródło

Odpowiedzi:

105

To są te same rzeczy. Jeśli użyjesz set transaction isolation levelinstrukcji, będzie ona miała zastosowanie do wszystkich tabel w połączeniu, więc jeśli chcesz mieć tylko nolockjedną lub dwie tabele, użyj jej; w przeciwnym razie użyj innego.

Obie dadzą ci nieprzyjemne odczyty. Jeśli się z tym zgadzasz, użyj ich. Jeśli nie możesz mieć brudnych odczytów, zamiast tego rozważ snapshotlub serializablepodpowiedzi.

HLGEM
źródło
Zastanów się REPEATABLE READzamiast tego SERIALIZABLE, czy nie obchodzą Cię dane pozorne. SERIALIZABLEjest NAPRAWDĘ restrykcyjny i prawie nigdy nie powinien być używany (z wyjątkiem na przykład niektórych krytycznych aplikacji finansowych).
Kryptos,
10
  • NOLOCK jest lokalny dla tabeli (lub widoków itp.)
  • READ UNCOMMITTED dotyczy sesji / połączenia

A jeśli chodzi o wytyczne ... losowe wyszukiwanie ze StackOverflow i elektrycznego interweb ...

gbn
źródło
Ostatni link „Dlaczego używanie NOLOCK jest złe ...” już nie istnieje.
sangam
1
sieć elektryczna jest bezcenna. dzięki za dodanie trochę słońca do mojego dnia.
JJS
9

O ile mi wiadomo, jedyną różnicą jest zakres efektów, jak powiedział Strommy. Wskazówka NOLOCK na stole i CZYTAJ NIEZGODNE na sesji.

Jeśli chodzi o problemy, które mogą wystąpić, chodzi o konsekwencję. Jeśli Ci zależy, pamiętaj, że możesz uzyskać tak zwane brudne odczyty, które mogą wpłynąć na manipulowanie innymi danymi na niepoprawnych informacjach.

Osobiście uważam, że nie widziałem z tym żadnych problemów, ale może to wynikać bardziej z tego, jak używam nolock. Musisz mieć świadomość, że istnieją scenariusze, w których użycie będzie w porządku. Scenariusze, w których najczęściej dodajesz nowe dane do tabeli, ale masz inny proces, który pojawia się w tyle, aby sprawdzić scenariusz dotyczący danych. Prawdopodobnie będzie dobrze, ponieważ główny przepływ nie obejmuje cofania się i aktualizowania wierszy podczas odczytu.

Uważam również, że w dzisiejszych czasach należy przyjrzeć się kontroli współbieżności wielu wersji. Uważam, że dodali go w 2005 roku i pomaga to powstrzymać pisarzy przed blokowaniem czytelników, dając czytelnikom migawkę bazy danych do użycia. Dołączę link i pozostawię dalsze badania czytelnikowi:

MVCC

Poziomy izolacji bazy danych

Sean Copenhaver
źródło
+1 Chociaż nie wdałem się w aspekt „powinieneś” w READ_UNCOMMITTED ”, Sean ładnie to porusza. Są też przypadki, w których możesz przeczytać ten sam wiersz dwukrotnie w SQL Server (ze względu na podziały strony).
Anon246
6

Nie możesz użyć opcji Odczyt niezatwierdzonego poziomu izolacji transakcji w widoku (w rzeczywistości możesz mieć tylko jeden skrypt), więc musisz użyć (nolock), jeśli powinny być uwzględnione brudne wiersze.

Rez.Net
źródło
4

Ponieważ musisz użyć WITH (NOLOCK) dla każdej tabeli, zapisywanie go w każdej klauzuli FROM lub JOIN może być denerwujące. Jednak ma powód, dla którego nazywa się to „brudną” lekturą. Więc naprawdę powinieneś wiedzieć, kiedy to robisz i nie ustawiać go jako domyślnego dla zakresu sesji. Czemu?

Zapomnienie Z (NOLOCK) może nie wpłynąć na twój program w bardzo dramatyczny sposób, jednak zrobienie brudnego czytania, gdy nie chcesz, może zrobić różnicę w pewnych okolicznościach.

Więc użyj WITH (NOLOCK), jeśli bieżące wybrane dane mogą być niepoprawne, ponieważ mogą zostać wycofane później. Jest to najczęściej używane, gdy chcesz zwiększyć wydajność, a wymagania dotyczące kontekstu aplikacji pozwalają na podjęcie ryzyka wyświetlania niespójnych danych. Jednak ty lub ktoś odpowiedzialny musi rozważyć zalety i wady decyzji o użyciu WITH (NOLOCK).

Alex
źródło