Из документации :
Блокировки
Shared (S)
позволяют параллельным транзакциям считывать (SELECT)
ресурс под пессимистическим контролем параллелизма. Для получения дополнительной информации см. Types of Concurrency Control
. Никакие другие транзакции не могут изменять данные, пока на ресурсе существуют блокировки shared (S)
. Блокировки Shared (S)
для ресурса снимаются, как только операция чтения завершается, если только уровень изоляции транзакции не установлен на повторяемое чтение или выше, или подсказка блокировки не используется для сохранения блокировок shared (S)
на время транзакции.
A shared lock
совместим с другой общей блокировкой или блокировкой обновления, но не с исключительной блокировкой.
Это означает, что ваши SELECT
запросы будут блокировать UPDATE
и INSERT
запросы и наоборот.
Запрос SELECT
установит временную разделяемую блокировку, когда он читает блок значений из таблицы, и удалит ее, когда завершит чтение.
Пока существует блокировка, вы не сможете ничего сделать с данными в заблокированной области.
Два SELECT
запроса никогда не будут блокировать друг друга (если они не SELECT FOR UPDATE
)
Вы можете включить SNAPSHOT
уровень изоляции в своей базе данных и использовать его, но учтите, что он не предотвратит блокировку UPDATE
запросов SELECT
запросами (что, по-видимому, является вашим случаем).
Это, однако, предотвратит блокировку SELECT
запросов UPDATE
.
Также обратите внимание, что SQL Server
, в отличие от Oracle
, использует менеджер блокировок и сохраняет его в списке связанных в памяти.
Это означает, что при большой нагрузке сам факт установки и снятия блокировки может быть медленным, поскольку сам связанный список должен быть заблокирован потоком транзакций.