簡體   English   中英

批量插入期間的SQL Server表鎖定

[英]SQL Server Table Lock during bulk insert

下面是示例查詢,請考慮A.

INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1
Select A.Col1,B.Col2,A.Col3,C.Col4       ----------------Statement#2
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK)
    ON A.Id = B.ID
    LEFT JOIN C WITH NOLOCK
    ON C.Id = B.ID
Where A.Id = 11

在哪個階段,鎖將應用於表[exclusive lock?],SQL將如何執行查詢?

  1. 將根據join和where子句從表A,B和C中獲取結果。
  2. 准備好結果時,開始在表中插入數據,同時在表上應用鎖定。

因此,當頁面上的實際數據被鎖定但是在選擇期間不會被鎖定,即使它是SELECT INSERT INTO嗎?

這兩個步驟是查詢執行的邏輯步驟。 SQL Server在物理層面上可以做什么/做什么是另一回事。 此刻:

INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1
Select A.Col1,B.Col2,A.Col3,C.Col4       ----------------Statement#2
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK)
    ON A.Id = B.ID
    LEFT JOIN C WITH NOLOCK
    ON C.Id = B.ID
Where A.Id = 11

對於每個輸出記錄(請參閱SELECT子句),它對目標表中的RIDKEY進行X lock (對於聚簇索引的堆/ KEY RID )並插入該記錄。 對每個輸出記錄重復此步驟。 因此,它不會從源表中讀取所有記錄,只有在此步驟之后才開始將記錄插入目標表中。 由於源表上的NOLOCK表提示,這些表上只需要Sch-S(模式穩定性)鎖。

如果你想在目標表上進行X鎖定,那么你可以使用

INSERT INTO Target WITH(TABLOCKX) (Col1,Col2,Col3,Col4)
SELECT ...

如果您想要最少記錄的插入,請閱讀本文

您是否指定了任何“表格鎖定”提示。 如果要將行級鎖定設置為“表鎖定”關閉。

或檢查它會幫助你...

http://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM