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)
- 死鎖
@Mitch小麥我發佈了我的代碼示例。 –
您可以通過sql日誌(通過切換跟蹤標誌)或讀取默認擴展事件來查找死鎖信息。 –