[英]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將如何執行查詢?
因此,當頁面上的實際數據被鎖定但是在選擇期間不會被鎖定,即使它是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
子句),它對目標表中的RID
或KEY
進行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.