我在 SQL Server 2008 中有一个视图 V
,它基本上是查看表 A
和 B
的内容。
create view V as
select * from A
union all
select * from B
从V
中读取会导致查询对基本表采取意向共享锁(IS lock),但也会在视图对象本身上采取意向共享锁(IS lock)。
很明显为什么我们需要在表上使用IS锁,我们可以看到,在视图上的IS锁可以防止对视图底层基础表的并发修改。这很好。
查询计划中没有提到视图,它完全被编译掉了,因此在这种情况下生成的计划只是来自两个基本表的简单行拼接。实际上,查询计划XML中唯一提到的视图是在语句文本中。
如果您在这些表上添加第二个视图U
,则从V
中读取不会对U
采取任何锁。这排除了引擎在A
和B
上所有视图中都采用IS锁的可能性。
数据库引擎如何知道在视图上采取锁?
- 语句文本是否再次解析?
- 查询规划器和底层执行之间是否有其他信息通道传递此信息?
有关详细信息,请参见dba.stackexchange上的相应问题。