Hasło hint nolock sql server w Google zwraca 43900 wyników, co może oznaczać jedno. Na ten temat napisano już dosłownie wszystko. Jednak mimo, że temat tak popularny to i tak odnoszę wrażenie, że NOLOCK nadal używany jest bez świadomości zalet i wad. Stąd ten wpis gdzie zebrałem kilka informacji wraz z kilkoma linkami na końcu.

Co powoduję NOLOCK?

Jest to równoznaczne z ustawieniem poziomem izolacji READ UNCOMMITTED, czyli oznacza ni mniej ni więcej, że pozwalamy na pobranie niezatwierdzonych danych w czasie naszego odczytu. Czyli na tak zwany brudny odczyt.

W tym momencie I – izolacja z zasady ACID dla naszej transakcji traci na znaczeniu, co oznacza, że blokady Exclusive i Update nie są brane na poważnie podczas odczytu danych.

Jakie są zalety NOLOCK?

Główną zaletą stosowania NOLOCKmniejsze możliwości blokowania i zakleszczania. Co niekiedy daje (złudny) efekt wydajniejszych zapytań, ale tylko dzięki temu, że nie ma potrzeby czekania na uzyskanie blokady, (choć pewne i tak są wymagane, ale o tym niżej).

I to tyle..

Jakie są wady NOLOCK?

Narażamy się na odczyt danych, które nigdy nie istniały, ponieważ po odczycie, inna transakcja po prostu ich nie zatwierdziła. Praktycznie nigdy ich nie było. Istnieje zagrożenie również odczytu dwukrotnie tych samych dany lub nie pobranie danych, które miałby usunięte a jednak ktoś się rozmyślił.

Kolejna sprawa, zapytania z wskazówką NOLOCK mogą w określonych sytuacjach zwracać błędy:

Error 601: Could not continue scan with NOLOCK due to data movement

To skutek wykonywanych w tym samym czasie operacji typu UPDATE/INSERT/DELETE, które mogą powodować przeniesienie lub podział stron podczas próby ich odczytu.

Dodatkowo zapytanie z NOLOCK wbrew temu, co mógłby się wydawać podczas wykonywania potrzebują blokad. Konkretnie to blokady stabilności schematu (Sch-S), aby zapobiec zmianie struktury tabeli.

Jak można zauważyć w tabeli Sch-S nie jest zgodna z blokadą Sch-M, którą uzyskują wszystkie polecenia zmiany struktury tabeli lub operacje przebudowy indeksów.

Co prawda ciężko to nazwać wadą (po prostu tak to działa), jednak trzeba pamiętać, że zapytania mimo NOLOCK potrafią być blokowane oraz blokować inne polecenia.

Stosować czy nie stosować?

Lepiej nie, a na pewno nie traktuj tego, jako nawyk. Jeśli jednak rozważasz zastosowanie NOLOCK odpowiedź sobie na pytania:
– Co jest powodem tego, że chcę dodać wskazówkę NOLOCK?
– Czy biznes może otrzymać niepewne dane?
– Jakie mogą być konsekwencję zwrócenia brudnych danych do aplikacji/systemu/raportu?

Linki

Mateusz Nadobnik

Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

read more