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?

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.


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 ...


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


+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.


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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.