长时间运行的查询是否会阻止插入涉及的表?

时间:2016-07-23 00:14:23

标签: sql-server

说我有两张桌子:

Table 1
[Clustered Id]    [Text Field]

Table 2
[Clustered Id]    [Numeric Field]

然后我有一个问题:

select *
  from [Table 1]
      ,[Table 2]
 where [Table 1].[Clustered Id] = [Table 2].[Clustered Id]
   and [Table 1].[Text Field] like '%some string%'

假设我的插入插入一行,如下所示:

insert into [Table 2]
values (new clustered ID)
      ,-182

如果此查询需要很长时间才能运行,那么在此期间是否可以插入[Table 2]?如果是这样,有什么细微差别?如果没有,我该怎么办才能避免呢?

2 个答案:

答案 0 :(得分:5)

是的,select会采用共享锁来防止更新锁定。

您可以使用提示"与(nolock)"在select上,它不会占用共享锁,也不会阻止更新锁定。但坏事可能会发生。这个网站上的很多人会告诉你永远不要这样做。

如果更新它只是一个行锁,那么只需要打开该行。

在更新时,添加<>非常有帮助镜像到集合所以它不会锁定

update table1  
set col1 = 12  
where col3 = 56 
and co1 <> 12  -- will not take an update lock

插入不同,因为它只会阻止页面锁定和制表符 请发布您的插入内容以及插入的行数。

如果您正在使用制表符,那么我认为插入会被阻止。即使有可重复阅读,我也不认为选择会阻止插入。

答案 1 :(得分:1)

除非您处于可序列化的隔离级别,否则您无需担心。您的选择不会阻止插入..

选择获取共享锁。谈到低级别,SQL需要对它试图插入的行进行独占锁定。我们也知道独占锁与共享锁不兼容。现在出现一个问题,如何选择被一个根本没有行的插入物阻挡。

隔离级别决定了选择锁的持续时间。在正常的隔离级别,只要读取了行就会释放共享锁。

只有在可序列化的范围内,才会执行范围锁定,锁定不会被释放,直到选择完全完成..