不确定这是否或多或少适合提出这个问题,最初是在Stack Overflow 上提出的。
在SQL Server 2008中我有一个观点V
在表A
和B
看起来大致是
create view V as
select * from A
union all
select * from B
Run Code Online (Sandbox Code Playgroud)
读取V
导致查询在基表上获取意图共享锁,但也会在视图对象本身上获取意图共享锁。
很明显为什么我们需要表上的 IS 锁,并且我们可以看到视图上的 IS 锁阻止了对视图底层表的并发修改。没关系。
查询计划没有提及视图。它是完全编译出来的,在这种情况下生成的计划是来自两个基表的行的简单串联。实际上,查询计划 XML 中唯一提到的视图是在语句文本中。
如果您U
在表上添加第二个视图,则读取V
不会导致任何锁定U
。这排除了引擎只对A
和上的所有视图进行 IS 锁定B
。
数据库引擎如何知道锁定视图?
如果是后者,存储引擎知道锁定视图的机制的细节可以被认为是内部的。然而,它这样做的事实是用户可见的,我希望它在某处被记录下来。