Имеет большое влияние.
Блокировка обновления принимает блокировку обновления в строке, намеренное обновление на странице и общую блокировку таблицы / базы данных.
Это не мешает другим запросам обращаться к данным в таблице, поскольку блокировки на странице / базе данных являются чисто общими блокировками. Они просто не могут конфликтовать блокировки с отдельной строкой / страницей / таблицей, пытаясь выполнить операцию, которая противоречила бы блокировкам. Если это произойдет, запрос будет поставлен в очередь за текущими блокировками и будет ждать его поступления, прежде чем он сможет продолжить.
При использовании удержания запрос принудительно сериализуется, блокируя таблицу исключительно до завершения действия. Это не позволяет никому читать таблицу, если не используется подсказка nolock, что допускает потенциально грязное чтение.
Чтобы увидеть эффект, сгенерируйте пример таблицы 'foo' и поместите в нее некоторые мусорные данные.
begin tran
select * from foo with (updlock)
where tableid = 1
-- notice there is no commit tran
Откройте другое окно и попробуйте:
select * from foo
Строки возвращаются, теперь фиксируйте исходную транзакцию запроса. Перезапустите его, чтобы использовать Holdlock:
begin tran
select * from foo with (updlock, holdlock)
where tableid = 1
Вернитесь в другое окно и попробуйте выбрать данные еще раз, запрос не будет возвращать значения, поскольку он заблокирован исключительной блокировкой. Зафиксируйте транзакцию в первом окне, и появятся результаты для второго запроса, поскольку он больше не блокируется.
Последний тест - использование nolock, повторное выполнение транзакции с использованием updlock и holdlock. затем выполните следующее во втором окне:
select * from foo (nolock)
Результаты будут возвращаться автоматически, так как вы допустили риск грязного чтения (чтение незафиксировано).
Таким образом, считается, что он оказывает большое влияние, поскольку вы принудительно сериализуете действия с этой таблицей, что может быть тем, что вы хотите (в зависимости от выполняемого обновления), или создаете очень большое узкое место в этой таблице. Если бы все это делали с занятой таблицей с длительными транзакциями, это привело бы к значительным задержкам в приложении.
Как и во всех функциях SQL, при правильном использовании они могут быть мощными, но неправильное использование функции / подсказки может вызвать серьезные проблемы. Я предпочитаю использовать подсказки в качестве крайней меры, когда мне нужно переопределить движок, а не в качестве подхода по умолчанию.
Редактировать как запрошено: протестировано в SQL 2005, 2008, 2008R2 (All Enterprise) - все установлено с настройками по умолчанию, тестовая база данных создана с использованием всех значений по умолчанию (только что введено только имя базы данных).