批量插入期间的SQL Server表锁定

时间:2013-09-13 06:03:49

标签: sql sql-server

以下是示例查询,请考虑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. 在准备好的结果上,开始在表格中插入数据,同时在表格上应用锁定。
  3. 因此当页面上的实际数据被锁定但是在选择期间没有被锁定,即使它是用SELECT INSERT INTO进行的吗?

2 个答案:

答案 0 :(得分:2)

这两个步骤是查询执行的逻辑步骤。 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子句),X lock上的RID或目标表中的KEYRID表示堆/对于聚集索引KEY,它会插入该记录。对每个输出记录重复此步骤。 因此,它不会读取源表中的所有记录,只有在此步骤之后才会开始将记录插入到目标表中。由于源表上的NOLOCK表提示,它只需要Sch-S(模式稳定性)会锁定这些表。

如果你想在目标表上进行X锁定,那么可以使用

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

如果您想要最少记录的插入内容,请阅读此article

答案 1 :(得分:0)

您是否指定了任何"表锁定"暗示。如果你想要行级锁定设置"表锁定"关闭。

或检查一下它会对你有帮助......

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