我正在使用一个进程,在连续的2个表中使用rowlock插入数据。同时我想对这些表使用一些查询。正如我所说,插入是用(rowlock)完成的,我用于查询,隔离级别读取未注册和nolock。
当我在单个表上使用查询时,它们完美地工作,但是当我尝试加入2个表时,我收到此错误:
事务(进程ID 88)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该交易。
同时,如果我使用sp_lock过程,我发现在执行查询时,Key lock会成为Tab锁。
有谁知道(nolock)和加入之间是否存在特殊关系?如果有,我怎么能避免它。
更新:
Insert into tbl1 with (rowlock)
(
col1,
col2,
col3
)
select * from #tbl_temp
(这是一个无限循环,来自#tbl_temp的数据总是在变化。实际上这是一个更复杂的过程,但这就是主意。)
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)
- 死锁