我昨天整天跑了一個查詢。每次運行約需2小時。沒有問題。我正在監視取出的鎖並檢查被阻止的進程。有一個過程必須每15分鐘運行一次,所以我通過檢查一個表的內容並等待它爲空來解決這個問題(過程會在完成時清空它)。然後我的查詢繼續。如果沒有取出鎖,爲什麼會阻止查詢?
當我離開這一天時,我又打開了這個查詢,今天早上我來看看電子郵件,說我離開後5分鐘就開始阻止進程。
sp_who2顯示我的進程當前處於'WAITFOR'命令中,並且我的查詢輸出顯示了相同的內容。當時沒有鎖。但它仍在阻止其他進程。
如果沒有取出鎖,爲什麼會阻塞進程?爲什麼當進行NO插入時會阻塞進程? WAITFOR處於while循環的頂部。再次,我整天沒有問題地跑了這個。它等待整個過程完成,然後繼續。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
declare @start bigint
declare @end bigint
declare @max bigint
declare @step int
set @step = 49999
set @start = 120790808
set @end = @start + @step
set @max = @start + 50000000
while (@end < @max)
begin
while (select COUNT(*) from SomeOtherTable (nolock)) > 0
begin
print 'Waiting for process'
waitfor delay '00:00:30'
end
begin transaction
update [TableA] with (tablock)
set [TableA].[ColumnA] = [TableB].[ColumnA]
from [TableB] (nolock)
where [TableB].[ColumnB] = [TableA].[ColumnB]
and [TableA].ID >= @start
and [TableA].ID < @end
commit transaction
print @end
if @end >= @max
begin
break
end
set @start = @end
set @end = @end + @step
end
它阻塞了什麼?在另一個過程中可能有非常高的隔離級別。 – JNK
NoLock不完全鎖定,它仍然發出Sch-S鎖,是否有任何事情在該窗口期間嘗試修改表格架構? – Andrew
多數民衆贊成在這一點上,它阻止了我在監控期間全天運行的一個進程,並且沒有任何問題。然而,有一個工作步驟也阻止了。我正在等待另一個開發人員進入,以便我能夠弄清楚它的功能。 – ILovePaperTowels