SQL nolock和join

时间:2011-09-02 07:28:00

标签: sql tsql sql-server-2008

我正在使用一个进程,在连续的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)

- 死锁

1 个答案:

答案 0 :(得分:0)

您可能想尝试为数据库启用READ_COMMITTED_SHAPSHOT隔离级别。

(但请注意,这会给tempDB增加压力)