Обычно нет, но это зависит (наиболее часто используемый ответ для SQL Server!)
SQL Server должен каким-то образом блокировать данные, участвующие в транзакции. Он должен заблокировать данные в самой таблице, а также данные любых затронутых индексов, пока вы выполняете модификацию. Чтобы улучшить параллелизм, существует несколько «гранулярностей» блокировок, которые сервер может решить использовать, чтобы разрешить запуск нескольких процессов: блокировки строк, блокировки страниц и таблицы часто встречаются (их больше). Какой масштаб блокировки используется, зависит от того, как сервер решит выполнить данное обновление. Сложные вещи, существуют также классификации блокировок, таких как разделяемые, исключительные и исключающие намерения, которые определяют, можно ли читать и / или изменять заблокированный объект.
По моему опыту, SQL Server в основном использует блокировки страниц для изменений небольших частей таблиц, и после превышения некоторого порогового значения он автоматически переходит в блокировку таблицы, если на большую часть таблицы (по статистике) влияет обновление или удаление. Идея состоит в том, что быстрее блокировать таблицу (одну блокировку), чем получать и управлять тысячами отдельных блокировок строк или страниц для большого обновления.
Чтобы увидеть, что происходит в вашем конкретном случае, вам нужно взглянуть на логику запроса и, пока ваши материалы работают, изучить условия блокировки / блокировки в sys.dm_tran_locks, sys.dm_os_waiting_tasks или других DMV. Вы бы хотели узнать, что именно блокируется на каком шаге в каждом из ваших процессов, чтобы понять, почему один из них блокирует другой.