Получает ли простой запрос выбора блокировки?


14

Я очень новичок в SQL Server и хотел бы понять, будут ли следующие, очень простые selectутверждения принимать какие-либо блокировки.

Select * from Student;

Пожалуйста, рассмотрите случай, когда инструкция не будет выполняться внутри begin tranблока.


1
Это гораздо более сложный вопрос, чем вы думаете. Ответ зависит от многих факторов (каков уровень изоляции транзакции сеанса? Включена ли функция фиксации моментального снимка при чтении? Есть ли у отсканированного индекса параметры, установленные для предотвращения блокировки строк или страниц?), И может даже измениться во время выполнения оператора (сколько строки находятся в таблице? является ли таблица секционированной?). Вот хороший момент, чтобы начать читать.
Джон Зигель

Ответы:


5

Да, он принимает общую блокировку для строк, которые он читает по умолчанию (он также принимает блокировку Intent Shared для всех страниц кластерного индекса, который он будет читать), это делается для предотвращения грязного чтения. Однако есть способы обойти это (SQL Server имеет подсказку nolock). Если инструкция не находится в BEGIN TRAN, блокировка снимается после выполнения инструкции SELECT.

Более подробную информацию можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server


Кроме того, вы также можете установить уровень изоляции транзакции для чтения незафиксированным.
Зейн

1
Итак, если SELECT читает десять строк, удерживаются ли десять общих блокировок до тех пор, пока не будут прочитаны все десять строк, или они получены и освобождены для каждой строки?
Ян

26

Я хотел бы понять, будут ли следующие, очень простые операторы select принимать какие-либо блокировки

Это распространенное заблуждение , что SELECTзапрос работает на по умолчанию READ COMMITTEDуровня изоляции транзакции будет всегда берет разделяемые блокировки для предотвращения грязного чтения.

SQL Server может избежать принятия общих блокировок на уровне строк, когда нет опасности чтения незафиксированных данных без них (хотя все еще используются блокировки более высокого уровня Intent-Shared (IS)).

Даже если общие блокировки строк будут приняты (возможно , потому , что другая параллельная транзакция изменила страницу строка включена) , они могут быть освобождены задолго до SELECTЗавершает заявление.

В большинстве случаев строка разблокируется непосредственно перед тем, как сервер обработает следующую строку. Существуют обстоятельства, при которых общие блокировки, принятые на уровне изоляции по умолчанию, сохраняются до конца текущего оператора, но не до конца транзакции .

Переопределение текущего уровня изоляции с помощью NOLOCKтабличной подсказки почти всегда является плохой идеей .

Блокировка - это деталь реализации. SQL Server принимает блокировки при необходимости, чтобы гарантировать, что он соответствует семантическим гарантиям, предоставляемым текущим уровнем изоляции . Конечно, бывают моменты, когда полезно немного узнать о причинах взлома блокировок, но попытки предсказать их очень часто приводят к обратным результатам.

SQL Server предоставляет широкий спектр уровней изоляции; выберите тот, который обеспечивает гарантии и поведение, в котором нуждаются ваши потребители данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.