SELECT
w SQL Server umieści wspólną blokadę w wierszu tabeli - i drugi SELECT
wymagałoby również wspólnej blokady, a te są ze sobą kompatybilne.
Więc nie - jeden SELECT
nie można zablokować innego SELECT
.
Co WITH (NOLOCK)
wskazówka zapytania służy do odczytywania danych, które są w trakcie wstawiania (przez inne połączenie) i które nie zostały jeszcze zatwierdzone.
Bez tej wskazówki dotyczącej zapytania SELECT
może zostać zablokowany odczyt tabeli przez trwający INSERT
(lub UPDATE
) oświadczenie, które umieszcza wyłączność zablokuj wiersze (lub ewentualnie całą tabelę), dopóki transakcja tej operacji nie zostanie zatwierdzona (lub wycofana).
Problem WITH (NOLOCK)
wskazówka brzmi:być może czytasz wiersze danych, które nie zostaną w ogóle wstawione na końcu (jeśli INSERT
transakcja zostanie wycofana) - więc np. raport może pokazywać dane, które tak naprawdę nigdy nie zostały zapisane w bazie danych.
Jest jeszcze jedna wskazówka dotycząca zapytania, która może być przydatna — WITH (READPAST)
. To instruuje SELECT
polecenie, aby po prostu pominąć wszystkie wiersze, które próbuje odczytać i które są wyłącznie zablokowane. SELECT
nie zablokuje się i nie odczyta żadnych "brudnych" niezatwierdzonych danych - ale może pominąć niektóre wiersze, np. nie pokazuj wszystkich swoich wierszy w tabeli.