说我有两张桌子:
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]
?如果是这样,有什么细微差别?如果没有,我该怎么办才能避免呢?
答案 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需要对它试图插入的行进行独占锁定。我们也知道独占锁与共享锁不兼容。现在出现一个问题,如何选择被一个根本没有行的插入物阻挡。
隔离级别决定了选择锁的持续时间。在正常的隔离级别,只要读取了行就会释放共享锁。
只有在可序列化的范围内,才会执行范围锁定,锁定不会被释放,直到选择完全完成..