[英]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.