В SQL Server 2008 у меня есть представление V
по таблицам A
и B
, которое выглядит примерно так
create view V as
select * from A
union all
select * from B
Чтение из V
приводит к тому, что запрос принимает общие блокировки намерений на базе. table , но также использует совместную блокировку намерения для самого объекта представления .
Понятно, почему нам нужны IS-блокировки для таблиц, и мы видим, что IS-блокировка для представления предотвращает одновременную модификацию таблиц, лежащих в основе представления. Это нормально.
План запроса не содержит упоминания о представлении. Он полностью скомпилирован, и результирующий план в данном случае представляет собой простое объединение строк из двух базовых таблиц. Действительно, единственное упоминание о представлении в XML-плане запроса находится в тексте инструкции.
Если вы добавите второе представление U
над таблицами, чтение из V
не приведет к блокировке U
. Это исключает то, что движок просто блокирует IS для всех представлений по A
и B
.
Как ядро базы данных узнает, что нужно заблокировать представление?
Подробности см. в соответствующем вопросе по dba.stackexchange
.