Czy ktoś może wyjaśnić konsekwencje używania with (nolock)
zapytań, kiedy powinieneś / nie powinieneś ich używać?
Na przykład, jeśli masz aplikację bankową z dużymi szybkościami transakcji i dużą ilością danych w niektórych tabelach, w jakich typach zapytań nolock byłby w porządku? Czy są przypadki, w których powinieneś zawsze go używać / nigdy nie używać?
sql-server
nolock
Andy White
źródło
źródło
Odpowiedzi:
Z (NOLOCK) jest odpowiednikiem użycia CZYTAJ UNCOMMITED jako poziom izolacji transakcji. Ryzykujesz więc odczytaniem nieprzydzielonego wiersza, który jest następnie wycofywany, tj. Danych, które nigdy nie trafiły do bazy danych. Tak więc, chociaż może zapobiec zakleszczeniu odczytów przez inne operacje, wiąże się z tym ryzyko. W aplikacji bankowej o wysokich stawkach transakcyjnych prawdopodobnie nie będzie to właściwe rozwiązanie problemu, który próbujesz rozwiązać za pomocą IMHO.
źródło
NOLOCK
z,SELECT
istnieje ryzyko zwrócenia tych samych wierszy więcej niż raz (zduplikowane dane), jeśli dane zostaną kiedykolwiek wstawione (lub zaktualizowane) do tabeli podczas dokonywania wyboru.Pytanie jest gorsze:
W przypadku finansowych baz danych impasy są znacznie gorsze niż złe wartości. Wiem, że to brzmi wstecz, ale wysłuchaj mnie. Tradycyjnym przykładem transakcji DB jest aktualizacja dwóch wierszy, odejmowanie od jednego i dodawanie do drugiego. To jest złe.
W finansowej bazie danych korzystasz z transakcji biznesowych. Oznacza to dodanie jednego wiersza do każdego konta. Bardzo ważne jest, aby transakcje te zostały zakończone, a wiersze zostały pomyślnie zapisane.
Tymczasowe zebranie salda konta nie jest wielką sprawą, po to właśnie służy uzgadnianie na koniec dnia. A przekroczenie salda na rachunku jest znacznie bardziej prawdopodobne, ponieważ używane są dwa bankomaty naraz, niż z powodu niezaangażowanego odczytu z bazy danych.
To powiedziawszy, SQL Server 2005 naprawił większość
NOLOCK
niezbędnych błędów . Więc jeśli nie używasz SQL Server 2000 lub wcześniejszego, nie powinieneś go potrzebować.Dalsza lektura
Wersje na poziomie wierszy
źródło
Niestety nie chodzi tylko o odczytanie nieprzekazanych danych. W tle możesz skończyć czytać strony dwukrotnie (w przypadku podziału strony) lub możesz całkowicie pominąć strony. Twoje wyniki mogą być rażąco wypaczone.
Sprawdź artykuł Itzika Ben-Gana . Oto fragment:
źródło
Przykładem podręcznika do prawidłowego użycia podpowiedzi nolock jest próbkowanie raportu w bazie danych OLTP o wysokiej aktualizacji.
Weźmy aktualny przykład. Jeśli duży amerykański bank centralny chciałby generować raport godzinowy w poszukiwaniu pierwszych oznak uruchomienia banku na poziomie miasta, zapytanie nolock mogłoby skanować tabele transakcji sumujące depozyty i wypłaty gotówki według miasta. W przypadku takiego raportu niewielki procent błędów spowodowanych wycofanymi transakcjami aktualizacji nie zmniejszyłby wartości raportu.
źródło
Nie wiesz, dlaczego nie zawijasz transakcji finansowych w transakcjach w bazie danych (tak jak w przypadku transferu środków z jednego konta na drugie - nie zatwierdzasz jednej strony transakcji naraz - dlatego istnieją jawne transakcje). Nawet jeśli Twój kod jest w jakikolwiek sposób powiązany z transakcjami biznesowymi, tak jak się wydaje, wszystkie transakcyjne bazy danych mogą potencjalnie spowodować niejawne wycofanie w przypadku błędów lub awarii. Myślę, że ta dyskusja jest ponad twoją głową.
Jeśli masz problemy z blokowaniem, zaimplementuj wersjonowanie i wyczyść kod.
Żadna blokada nie tylko zwraca nieprawidłowe wartości, ale także rekordy i duplikaty fantomów.
Jest powszechnym błędnym przekonaniem, że zawsze przyspiesza uruchamianie zapytań. Jeśli na stole nie ma żadnych blokad zapisu, nie robi to żadnej różnicy. Jeśli na stole są blokady, może to przyspieszyć zapytanie, ale istnieje powód, dla którego wymyślono blokady.
Szczerze mówiąc, oto dwa specjalne scenariusze, w których podpowiedź nolocka może zapewnić użyteczność
1) Baza danych serwera SQL sprzed 2005 r., Która musi uruchamiać długie zapytania względem bazy danych OLTP na żywo, może to być jedyny sposób
2) Źle napisana aplikacja, która blokuje rekordy i zwraca kontrolę do interfejsu użytkownika, a czytniki są blokowane na czas nieokreślony. Nolock może być pomocny, jeśli aplikacja nie może zostać naprawiona (strona trzecia itp.), A baza danych jest wcześniejsza niż 2005 lub nie można włączyć wersji.
źródło
NOLOCK
jest równoważneREAD UNCOMMITTED
, jednak Microsoft twierdzi, że nie należy go używać do tegoUPDATE
aniDELETE
oświadczeń:http://msdn.microsoft.com/en-us/library/ms187373.aspx
Ten artykuł dotyczy SQL Server 2005, więc obsługa
NOLOCK
istnieje, jeśli używasz tej wersji. Aby zabezpieczyć kod na przyszłość (zakładając, że zdecydowałeś się użyć brudnych odczytów), możesz użyć tego w swoich procedurach przechowywanych:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
źródło
Możesz go użyć, gdy czytasz tylko dane, a tak naprawdę nie zależy ci na tym, czy odzyskujesz dane, które nie zostały jeszcze zatwierdzone.
Operacja odczytu może być szybsza, ale tak naprawdę nie mogę powiedzieć, ile.
Ogólnie rzecz biorąc, odradzam korzystanie z niego - odczytywanie nieprzekazywanych danych może być co najmniej nieco mylące.
źródło
Innym przypadkiem, w którym zwykle jest to w porządku, jest baza danych raportowania, w której dane są już prawdopodobnie przestarzałe i zapisy po prostu się nie zdarzają. W takim przypadku jednak administrator powinien ustawić tę opcję na poziomie bazy danych lub tabeli, zmieniając domyślny poziom izolacji.
W ogólnym przypadku: można go używać, gdy jesteś bardzo pewny, że to jest w porządku, aby czytać stare dane. Ważne jest, aby pamiętać, że bardzo łatwo to zrobić źle . Na przykład, nawet jeśli w momencie pisania zapytania jest to w porządku, czy na pewno coś się nie zmieni w bazie danych, aby te aktualizacje były ważniejsze?
Zastanowię się też nad tym, że w bankowości prawdopodobnie nie jest to dobry pomysł. Lub aplikacja asortymentowa. Lub gdziekolwiek myślisz o transakcjach.
źródło
Prosta odpowiedź - ilekroć SQL nie zmienia danych i masz zapytanie, które może zakłócać inne działania (poprzez blokowanie).
Warto zastanowić się nad wszelkimi zapytaniami używanymi w raportach, zwłaszcza jeśli zapytanie zajmuje więcej niż, powiedzmy, 1 sekundę.
Jest to szczególnie przydatne, jeśli masz raporty typu OLAP uruchomione dla bazy danych OLTP.
Pierwsze pytanie, które należy zadać, to: „dlaczego się tym martwię?” Z mojego doświadczenia wynika, że fałszowanie domyślnego zachowania blokowania często ma miejsce, gdy ktoś znajduje się w trybie „spróbuj czegoś” i jest to jeden przypadek, w którym nieoczekiwane konsekwencje nie są mało prawdopodobne. Zbyt często jest to przypadek przedwczesnej optymalizacji i może zbyt łatwo zostać osadzony w aplikacji „na wszelki wypadek”. Ważne jest, aby zrozumieć, dlaczego to robisz, jaki problem rozwiązuje i czy rzeczywiście masz problem.
źródło
Krótka odpowiedź:
Używaj tylko
WITH (NOLOCK)
w instrukcji SELECT w tabelach, które mają indeks klastrowany.Długa odpowiedź:
Z (NOLOCK) jest często wykorzystywany jako magiczny sposób na przyspieszenie odczytu bazy danych.
Zestaw wyników może zawierać wiersze, które nie zostały jeszcze zatwierdzone, a które często są później wycofywane.
Jeśli Z (NOLOCK) zostanie zastosowane do tabeli, która ma indeks nieklastrowany, wówczas indeksy wierszy można zmienić za pomocą innych transakcji, ponieważ dane wiersza są przesyłane strumieniowo do tabeli wyników. Oznacza to, że w zestawie wyników może brakować wierszy lub wyświetlać ten sam wiersz wiele razy.
CZYTAJ ZOBOWIĄZANIE dodaje dodatkowy problem, w którym dane są uszkodzone w jednej kolumnie, w której wielu użytkowników zmienia tę samą komórkę jednocześnie.
źródło
READ UNCOMITTED
go w ogóle nie wpłynie na to. Istnieje powód, dla którego został włączony do standardu ANSI.Moje 2 centy - warto używać
WITH (NOLOCK
), gdy trzeba generować raporty. W tym momencie dane niewiele by się zmieniły i nie chcesz blokować tych rekordów.źródło
Jeśli zajmujesz się transakcjami finansowymi, nigdy nie będziesz chciał z nich korzystać
nolock
.nolock
najlepiej jest wybierać z dużych tabel, które mają wiele aktualizacji i nie obchodzi cię, czy rekord, który uzyskasz, może być nieaktualny.Dokumenty finansowe (i prawie wszystkie inne rekordy w większości aplikacji)
nolock
spowodowałyby spustoszenie, ponieważ potencjalnie można było odczytać dane z rekordu, który został zapisany, i nie uzyskać poprawnych danych.źródło
Zwykłem pobierać „następną partię” rzeczy do zrobienia. W tym przypadku nie ma znaczenia, który dokładnie element, i mam wielu użytkowników uruchamiających to samo zapytanie.
źródło
Korzystaj z nolock, gdy jesteś w porządku z „brudnymi” danymi. Co oznacza, że nolock może również odczytywać dane, które są w trakcie modyfikacji i / lub nieprzypisane dane.
Zasadniczo nie jest dobrym pomysłem używanie go w środowisku o wysokich transakcjach i dlatego nie jest domyślną opcją dla zapytania.
źródło
Używam ze wskazówką (nolock) szczególnie w bazach danych SQLServer 2000 o dużej aktywności. Nie jestem jednak pewien, czy jest to potrzebne w SQL Server 2005. Ostatnio dodałem tę wskazówkę w SQL Server 2000 na żądanie DBA klienta, ponieważ zauważył wiele blokad rekordów SPID.
Wszystko, co mogę powiedzieć, to to, że użycie podpowiedzi NIE zaszkodziło nam i wydaje się, że problem z blokowaniem sam się rozwiązał. DBA w tym konkretnym kliencie zasadniczo nalegało, abyśmy skorzystali z podpowiedzi.
Nawiasem mówiąc, bazy danych, którymi się zajmuję, są back-endami do korporacyjnych systemów roszczeń medycznych, więc mówimy o milionach rekordów i ponad 20 tabel w wielu połączeniach. Zazwyczaj dodaję podpowiedź Z (nolock) do każdej tabeli w złączeniu (chyba że jest to tabela pochodna, w którym to przypadku nie możesz użyć tej konkretnej wskazówki)
źródło
Najprostsza odpowiedź to proste pytanie - czy chcesz, aby wyniki były powtarzalne? Jeśli tak, to NOLOCKS w żadnym wypadku nie jest odpowiedni
Jeśli nie potrzebujesz powtarzalności, przydatne mogą być nolocks, szczególnie jeśli nie masz kontroli nad wszystkimi procesami łączącymi się z docelową bazą danych.
źródło