在 SQL Server 2008 中,我V
对表有一个视图A
,B
看起来大致像
create view V as
select * from A
union all
select * from B
读取 fromV
会导致查询在基表上获取意向共享锁,但也会在视图对象本身上获取意向共享锁。
很清楚为什么我们需要表上的 IS 锁,我们可以看到视图上的 IS 锁可以防止对视图下的表进行并发修改。没关系。
查询计划没有提及视图。它已完全编译出来,在这种情况下,生成的计划是两个基表中行的简单串联。实际上,查询计划 XML 中唯一提到视图的是语句文本。
如果您U
在表上添加第二个视图,则读取 fromV
不会导致任何锁定U
。这排除了引擎只对所有视图进行 IS 锁定A
和B
。
数据库引擎如何知道要锁定视图?
- 语句文本是否再次解析?
- 查询计划器和底层执行之间是否有其他信息渠道来传递这些信息?
有关详细信息,请参阅相应的问题dba.stackexchange
。