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