Sql Server Management Studio: таблица заблокирована из-за оператора select
Учитывая следующий сценарий: Оператор выбора выполняется из Sql Server Management Studio (2005, 2008) для получения большого набора результатов. Это не делается путем выбора "Изменить верхние 200 строк" из контекстного меню.
Наш администратор базы данных говорит, что, возможно, это может заблокировать запрашиваемую таблицу. Разблокировка происходит, когда результаты запроса закрыты.
Я не могу найти документацию, которая подтверждает, что это правда. Итак, факт или вымысел?
Редактировать:
Выбранный ответ Аарона, и спасибо Юрию и Ллойду за полезные ответы.
С Уважением,
Мишель
3 ответа
SELECT запускается один раз, и общие блокировки (не исключительные блокировки!) Снимаются после завершения чтения данных. Это может точно совпадать с последней строкой, отображаемой на клиенте, но это может произойти за несколько миллисекунд до. Тот факт, что результаты открыты на клиенте, не известен SQL Server (если мы не говорим о "Открыть таблицу" / "Редактировать первые 200 строк"). Я не думаю, что с помощью одного оператора SELECT возможно заблокировать таблицу так, как вы описываете - другие читатели и писатели должны нормально работать с таблицей, хотя может быть некоторая конкуренция (не исключительная блокировка), пока ваша SELECT запущен.
Однако вы можете смоделировать это, сделав некоторую комбинацию...
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM dbo.table WITH (TABLOCKX);
... а затем иди на обед.
Попробуйте прочитать эту статью. Режимы блокировки
Общие замки
Общие (S) блокировки позволяют параллельным транзакциям считывать (SELECT) ресурс под пессимистическим контролем параллелизма. Для получения дополнительной информации см. Типы управления параллелизмом. Никакие другие транзакции не могут изменять данные, пока на ресурсе существуют общие (S) блокировки. Общие (S) блокировки ресурса освобождаются, как только операция чтения завершается, если только уровень изоляции транзакции не установлен на повторяемое чтение или выше, или не используется подсказка блокировки для сохранения общих (S) блокировок на время действия сделка.
Ваш оператор SELECT заблокирует таблицу, чтобы изменения не могли быть внесены в таблицу во время выполнения вашего оператора. Он не будет блокировать таблицу от других операторов SELECT.
Операторы SELECT работают с использованием общих блокировок. Общие блокировки совместимы с другими общими блокировками. В результате вы можете иметь несколько операторов SELECT для одной и той же таблицы. Любые изменения, внесенные в таблицу, требуют эксклюзивной блокировки. Таблица должна дождаться завершения всех общих блокировок, прежде чем она сможет предоставить соединению эксклюзивную блокировку. Таким образом, транзакция, которая вносит изменения в таблицу, должна ждать, пока все остальные транзакции на конце таблицы.