繁体   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