【发布时间】:2012-05-04 08:16:37
【问题描述】:
在 SQL Server 2008 中,我对表 A 和 B 有一个视图 V,看起来大致类似
create view V as
select * from A
union all
select * from B
从V 读取会导致查询获取基表上的意向共享锁,但也会获取视图对象上的意向共享锁。。 p>
很清楚为什么我们需要表上的 IS 锁,我们可以看到视图上的 IS 锁可以防止对视图下的表进行并发修改。没关系。
查询计划没有提及视图。它已完全编译出来,在这种情况下,生成的计划是两个基表中行的简单串联。实际上,查询计划 XML 中唯一提到视图的是语句文本。
如果您在表上添加第二个视图U,则从V 读取不会导致对U 进行任何锁定。这排除了引擎只对A 和B 上的所有视图进行IS 锁定。
数据库引擎如何知道要锁定视图?
- 语句文本是否再次解析?
- 在查询规划器和底层执行之间是否有其他信息渠道来传递这些信息?
【问题讨论】:
-
大概是从锁定视图开始,以防止在使用视图时更改视图的设计。
-
@JamieSee,那么它需要一个 S od Sch-M 锁。
-
执行计划以二进制格式存储。并非它包含的所有内容都在显示给我们的 XML 中表示。
-
@MartinSmith 我认为这可能是答案。存储引擎知道锁定视图的机制的细节可以公平地被认为是内部的,但它这样做的事实是用户可见的,我希望它会记录在某个地方。
标签: sql sql-server sql-server-2008 view database-locking