以下是示例查询,请考虑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
当表格被锁定的阶段是什么时候[独占锁?],SQL将如何执行查询?
- 根据连接和where子句从表A、B和C中获取结果。
- 在准备好的结果上,开始向表中插入数据,并同时对表进行加锁。
因此,即使使用INSERT INTO与SELECT,只有在实际写入页面表格时才会锁定表格,而不是在选择时。
TABLOCKX
,則在將每個記錄插入目標表之前,會在記錄級別(RID/KEY)獲取 X 鎖。使用TABLOCKX
暗示後,在語句執行開始時只需一次即可在表級別上獲取 X 鎖。 - Bogdan Sahlean