A SELECT
в SQL Server ще постави споделено заключване на ред на таблица - и втори SELECT
също ще изисква споделено заключване и те са съвместими едно с друго.
Така че не - един SELECT
не може да блокира друг SELECT
.
Какво е WITH (NOLOCK)
Подсказката за заявка се използва, за да можете да четете данни, които са в процес на вмъкване (от друга връзка) и които все още не са заети.
Без този намек за заявка, SELECT
може да бъде блокирано четенето на таблица от текущ INSERT
(или UPDATE
) изявление, което поставя изключително заключване на редове (или евентуално цяла таблица), докато транзакцията на тази операция не бъде ангажирана (или връщане назад).
Проблем с WITH (NOLOCK)
намек е:може да четете редове с данни, които изобщо няма да бъдат вмъкнати, в крайна сметка (ако INSERT
транзакцията се връща назад) - така че напр. отчетът може да показва данни, които никога не са били въведени в базата данни.
Има още един намек за заявка, който може да е полезен - WITH (READPAST)
. Това инструктира SELECT
команда просто да пропусне всички редове, които се опитва да прочете и които са изключително заключени. SELECT
няма да блокира и няма да чете никакви "мръсни" неангажирани данни - но може да пропусне някои редове, напр. не показва всичките си редове в таблицата.