SQL nolock 和 join
Posted
技术标签:
【中文标题】SQL nolock 和 join【英文标题】:SQL nolock and join 【发布时间】:2011-09-02 07:28:00 【问题描述】:我正在使用一个过程,该过程将数据连续插入到具有行锁的 2 个表中。同时我想对这些表使用一些查询。正如我所说的,插入是使用 (rowlock) 完成的,我使用隔离级别读取未提交和非锁定的查询。
当我在单个表上使用查询时,它们工作得很好,但是当我尝试加入 2 个表时,我得到了这个错误:
事务(进程 ID 88)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。
同时,如果我使用 sp_lock 过程,我发现当我执行查询时 Key lock 变成了 tab lock。
有谁知道 (nolock) 和 join 之间是否存在特殊关系?如果有,我该如何避免。
更新:
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)
-- 死锁
【问题讨论】:
@Mitch Wheat 我发布了我的代码示例。 您能否从 sql 日志(通过打开跟踪标志)或读取默认扩展事件中找到死锁信息。 【参考方案1】:您可能想尝试为您的数据库启用READ_COMMITTED_SHAPSHOT 隔离级别。
(但请注意,这会增加 tempDB 的压力)
【讨论】:
以上是关于SQL nolock 和 join的主要内容,如果未能解决你的问题,请参考以下文章
带有 nolocks 和 TRANSACTION ISOLATION LEVEL READ COMMITTED 的 SQL 事务