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日志(通过切换跟踪标志)或读取默认扩展事件来查找死锁信息。 –