2013-12-03 2 views
3

В SQL Server 2012, я явно блокировку таблицы, которые перечислены ниже:Выберите оператор ждет даже после применения NOLOCK

Ссылка: How to explicitly lock a table in Microsoft SQL Server (looking for a hack - uncooperative client)

В то время как эта блокировка происходит, я бегу SELECT, запрос с NOLOCK на этом столе. Но запрос не сохраняет данные до тех пор, пока я не остановлю окно 1 и не подожду еще некоторое время.

Почему не NOLOCK работает как ожидалось?

--Window 1

DECLARE @TranName VARCHAR(300) 
SET @TranName = 'MyTran'; 

BEGIN TRANSACTION @TranName 


DECLARE @Current INT 
SET @Current = 0 

DECLARE @LoopCount INT 
SET @LoopCount = 1; 

WHILE @Current < 1 
BEGIN 

     SET @LoopCount = @LoopCount+1; 
     PRINT @LoopCount 

     ALTER TABLE DBATCPH ADD LockTest INT 
     ALTER TABLE DBATCPH DROP COLUMN LockTest 

     WAITFOR DELAY '00:01'; 



END 

GO 

Go 

--Window 2

SELECT TOP 1 * FROM DBATCPH NOLOCK 
+4

Если вы выдаете команду «ALTER TABLE», SQL Server получит блокировку «SCH-M» (модификация схемы) - и это несовместимо даже с командой «NOLOCK». Нет обходного пути, никоим образом не обходимо - вам просто нужно это знать и уважать. [См. Документы TechNet о режимах блокировки] (http://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx) для подробного обсуждения –

+0

@marc_s. Итак, что такое alterantive для блокировки этой таблицы в явном виде? – Lijo

+0

До тех пор, пока блокировка 'SCH-M' на месте, вы ничего не можете сделать. Сначала вы должны совершить (или откат) эту транзакцию. –

ответ

5

Если выдать команду ALTER TABLE в транзакции, SQL Server приобретет SCH-M (модификация схемы) замок - и несовместим даже с операторами SELECT, которые используют подсказку запроса WITH (NOLOCK).

У вас нет обходного пути или трюка или другого подсказки, которую вы можете использовать, никоим образом не обходимо - вам просто нужно это знать и уважать. SCH-M будет выпущен после того, как транзакция с оператором ALTER TABLE была совершена (или откат).

See the TechNet docs on Lock Modes для подробного обсуждения - есть другие случаи (кроме ALTER TABLE), когда происходит блокировка SCH-M (например, когда таблица усечена).

Замок BU (Блокировка обновлений) также может предотвратить возникновение SELECT - однако он позволит другим транзакциям одновременно загружать навалом (но он ничего не позволяет).

Смежные вопросы