以下是示例查询,请考虑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进行的吗?
答案 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
或目标表中的KEY
(RID
表示堆/对于聚集索引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