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?
sql
sql-server
sql-server-2005
Jim B.
źródło
źródło
REPEATABLE READ
zamiast tegoSERIALIZABLE
, czy nie obchodzą Cię dane pozorne.SERIALIZABLE
jest NAPRAWDĘ restrykcyjny i prawie nigdy nie powinien być używany (z wyjątkiem na przykład niektórych krytycznych aplikacji finansowych).WITH (NOLOCK) to wskazówka na poziomie stołu. Ustawienie poziomu izolacji transakcji na READ_UNCOMMITTED ma wpływ na połączenie. Różnica dotyczy zakresu. Zobacz READUNCOMMITTED i NOLOCK w dokumentacji SQL Server tutaj:
http://technet.microsoft.com/en-us/library/ms187373.aspx
POZIOM IZOLACJI TRANSAKCJI: http://technet.microsoft.com/en-us/library/ms173763.aspx
źródło
A jeśli chodzi o wytyczne ... losowe wyszukiwanie ze StackOverflow i elektrycznego interweb ...
źródło
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
źródło
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.
źródło
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).
źródło