2011-09-02 68 views
0

我正在使用一個進程將數據連續插入到2個表中。同時我想在這些表上使用一些查詢。正如我所說的插入是用(rowlock)完成的,我使用查詢隔離級別讀取uncomitted和nolock。SQL nolock和加入

當我用一個單一的表查詢,他們完美地工作,但是當我嘗試加入2代表我得到這個錯誤:

事務(進程ID 88)已被死鎖的鎖資源與另一個進程並被選爲死鎖受害者。重新運行交易。

同時,如果我使用sp_lock過程,我發現當我執行我的查詢時,密鑰鎖成爲一個選項卡鎖。

有誰知道(nolock)和join之間是否存在特殊關係?如果有我能如何避免它。

UPDATE:

Insert into tbl1 with (rowlock) 
(
col1, 
col2, 
col3 
) 
select * from #tbl_temp 

(這是一個無限循環,並從#tbl_temp數據總是改變Actualy這是一個比較複雜的過程,但是,這是想法。)

Insert into tbl2 with (rowlock) 
(
col3, 
col4, 
col5 
) 

select * from #tbl_temp2 

在同一時間,我執行

set transaction isolation level read uncomitted 

select col1,col2,col3 
from tbl1 with (nolock) -- works fine 


select col1,col2,a.col3 

from tbl1 with (nolock) join tbl2 with (nolock) on (tbl1.col3 = tbl2.col3) 

- 死鎖

+0

@Mitch小麥我發佈了我的代碼示例。 –

+0

您可以通過sql日誌(通過切換跟蹤標誌)或讀取默認擴展事件來查找死鎖信息。 –

回答

0

您可能想要嘗試爲您的數據庫打開READ_COMMITTED_SHAPSHOT隔離級別。

(但是請注意,這會給tempDB帶來增加的壓力)