Joe*_*ney 12 sql sql-server view sql-server-2008 database-locking
在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.这排除了发动机只需要对所有意见IS锁了A和B.
数据库引擎如何知道对视图进行锁定?
有关详细信息,请参阅相应的问题dba.stackexchange.
默认情况下,视图像宏一样扩展到引用它们的查询中。
这可以被关闭,或者如果它们被实现的话会有所不同,等等,但类似宏的内联扩展是常态。这意味着锁定等的行为就像您执行了以下操作一样......
SELECT
*
FROM
blah
INNER JOIN
(
yourViewCode
)
AS aView
ON aView.id = blh.id
Run Code Online (Sandbox Code Playgroud)