2011-11-29 32 views
0

我昨天整天跑了一個查詢。每次運行約需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 
+1

它阻塞了什麼?在另一個過程中可能有非常高的隔離級別。 – JNK

+1

NoLock不完全鎖定,它仍然發出Sch-S鎖,是否有任何事情在該窗口期間嘗試修改表格架構? – Andrew

+0

多數民衆贊成在這一點上,它阻止了我在監控期間全天運行的一個進程,並且沒有任何問題。然而,有一個工作步驟也阻止了。我正在等待另一個開發人員進入,以便我能夠弄清楚它的功能。 – ILovePaperTowels

回答

0

在發佈的查詢中,包含顯式事務但沒有錯誤陷阱,可能(有可能)讓事務處於打開狀態。

如果BEGIN TRAN執行,但你永遠不COMMITROLLBACK交易將舉行無限期地開放,這可能會導致各種難以跟蹤阻塞問題。

+0

我相信當我停止執行時,它並沒有執行提交併保持打開保存Tablock的事務。考慮時間表和證據是最有意義的。 – ILovePaperTowels

0

是,像@ILovePaperTowels說 - update [TableA] with (tablock)意味着表級鎖。它會覆蓋您的隔離級別

+0

sp_who2顯示進程坐在'WAITFOR'而不是'INSERT'。 – ILovePaperTowels

+0

Waitfor進程在「已阻止」列中有一個非零值。尋找那個spid。如果它不是您的更新聲明,我會感到驚訝。 – Mordechai

相關問題