2011-09-02 64 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带来增加的压力)