Shared Lock выдан на IsolationLevel.ReadUncommitted

10

Я прочитал, что если я использую IsolationLevel.ReadUncommitted, запрос не должен вызывать никаких блокировок. Однако, когда я проверил это, я увидел следующую блокировку:

Resource_Type: HOBT
Request_Mode: S (Shared)

Что такое замок HOBT? Что-то связанное с HBT (блокировка кучи или двоичного дерева)?

Почему я все еще получу замок S?

Как избежать общей блокировки при запросах без включения функции моментального снимка уровня изоляции?

Я тестирую это на SQLServer 2008, и опция снимка отключена. Запрос выполняет только выбор.

Я вижу, что Sch-S требуется, хотя SQL Server, похоже, не показывает его в моем запросе блокировки. Почему он все еще выдает общий замок? Согласно с:

УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИЙ (Transact-SQL)

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

Так что я немного растерялся.

DSUM
источник

Ответы:

13

Что такое блокировка HOBT?

Блокировка, защищающая B-дерево (индекс) или страницы данных кучи в таблице, которая не имеет кластеризованного индекса.

Почему я все еще получу замок S?

Это происходит на кучах. пример

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

Вывод READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Вывод READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

Согласно этой статье, в которой упоминается Пол Рэндал, причиной взятия этой BULK_OPERATIONобщей блокировки HOBT является предотвращение чтения неформатированных страниц.

Мартин Смит
источник
5

Уровень изоляции ReadUncommitted устанавливает блокировки. Блокировки стабильности схемы предотвращают изменение запрашиваемых объектов во время выполнения запроса. Эти блокировки приобретаются под всеми уровнями изоляции, включая snapshot и read_committed_snapshot (RCSI). Из режимов блокировки :

Замки схемы

Компонент Database Engine использует блокировки модификации схемы (Sch-M) во время операции языка определения данных таблицы (DDL), такой как добавление столбца или удаление таблицы. Во время удержания блокировка Sch-M предотвращает одновременный доступ к столу. Это означает, что блокировка Sch-M блокирует все внешние операции, пока блокировка не будет снята.

Некоторые операции на языке манипулирования данными (DML), такие как усечение таблиц, используют блокировки Sch-M для предотвращения доступа к затронутым таблицам параллельными операциями.

Компонент Database Engine использует блокировки стабильности схемы (Sch-S) при компиляции и выполнении запросов. Блокировки Sch-S не блокируют никакие транзакционные блокировки, включая эксклюзивные (X) блокировки. Поэтому другие транзакции, включая транзакции с X-блокировками для таблицы, продолжают выполняться во время компиляции запроса. Однако одновременные операции DDL и параллельные операции DML, которые получают блокировки Sch-M, не могут быть выполнены для таблицы.

Ремус Русану
источник