#sql #sql-server #database
Вопрос:
В MS-SQL Server таблица не блокируется, когда запрос на чтение выбирает только одну строку. В многопоточной среде блокируется ли таблица при одновременном выполнении нескольких запросов одного и того же типа? Позвольте мне объяснить это на примере.
Таблица не будет заблокирована, так как мы выбираем только одну запись
select * from Employees where EmployeeId = 1234
Многопоточная среда:
select * from Employees where EmployeeId = 1234
select * from Employees where EmployeeId = 5678
select * from Employees where EmployeeId = 9012
select * from Employees where EmployeeId = 3456
Повлияет ли это на обработку данных, если чтение/запись будут выполняться в одном и том же экземпляре?
Пожалуйста, обратите внимание, что столбец EmployeeID индексируется.
Спасибо.
Комментарии:
1. Насколько я понимаю, в ваших запросах, использующих поиск по индексу в одной строке, блокировки таблиц или страниц не будут приниматься до тех пор, пока не будет превышен порог одновременных блокировок, я полагаю, что он составляет около 5000.
2. @Stu Не забывайте
IS
о блокировках таблиц, которые используются для последующего обновления до полной блокировки таблицы
Ответ №1:
Нет, весь стол не будет заблокирован. В зависимости от конфигурации и уровня изоляции эти запросы либо вообще не будут блокироваться, либо будут блокироваться общими строками/ключами.
Однако это довольно большая тема, и вам следует прочитать Руководство по блокировке транзакций и управлению версиями строк
Комментарии:
1. Мне бы хотелось знать, как вы вообще не снимаете замки, по крайней мере
Sch-S
, замок снимается. И наверняка вся таблица может быть заблокирована: строка или страницаS
также будутIS
заблокированы в таблице в случае, если она будет обновлена до полнойS
блокировки таблицы, что часто случается2. Я упрощал, опуская блокировку общей схемы и блокировки намерений. И эскалация блокировки не должна происходить с избирательным предикатом.