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 事务

在 SQL Azure 中支持 nolock

C# T-SQL 语句包含“with(nolock)”错误

SQL nolock 和 join

SQL Server 中的“with (nolock)”是啥?

sql Sql Query NoLock NoCount