Odpowiedzi:
To są te same rzeczy. Jeśli użyjesz set transaction isolation level
instrukcji, będzie ona miała zastosowanie do wszystkich tabel w połączeniu, więc jeśli chcesz mieć tylko nolock
jedną 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ż snapshot
lub serializable
podpowiedzi.
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
A jeśli chodzi o wytyczne ... losowe wyszukiwanie ze StackOverflow i elektrycznego interweb ...
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:
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).
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).