2016-07-23 51 views
3

說我有兩個表:長時間運行的查詢是否阻止插入到表中?

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

它取決於...這裏的線程會給你更多的信息:http://dba.stackexchange.com/questions/40987/does-a-simple-select -query-acquire-locks – objectNotFound

回答

5

是的選擇將採取共享鎖,將阻止更新鎖定。

您可以在select上使用提示「with(nolock)」,以便它不會佔用共享鎖並且不會阻止更新鎖定。但糟糕的事情可能會發生。本網站上的很多人會告訴你永遠不要這樣做。

如果更新它只是採取一個行鎖,那麼只有該行需要打開。

在更新它確實有助於增加<>鏡設定的,所以它不會採取鎖

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

的插件是不同的,因爲它只會在pagelock和TABLOCK阻塞。
請發佈您的插入和您插入多少行。

如果你正在使用tablock,那麼我認爲插入會被阻止。即使使用可重複讀取,我也不認爲選擇會阻止插入。

+0

如果你只插入一行,那麼你沒有什麼可擔心的。我有一些有數百萬行的表,我需要一次插入100,000個表。 – Paparazzi

1

除非你是在序列化隔離級別,你不需要worry.Your選擇不會塊插入..

選擇獲取共享locks.Talking約低的水平,SQL需要它是行獨佔鎖試圖插入。我們也知道獨佔鎖與共享鎖不兼容。現在出現了一個問題,一個選擇怎麼會被一個根本沒有一行的插入阻塞。

隔離級別決定了選擇鎖多少時間將held..In正常的隔離級別,共享鎖會盡快行被讀取發佈..

只有在序列化,範圍鎖採取和鎖定不會被釋放,直到選擇完全完成。

相關問題