У меня есть представление, которое содержит объединение нескольких таблиц. Если я использую «WITH (READUNCOMMITTED)» в представлении SELECT FROM, будет ли он распространяться и применяться к таблицам, которые соединены представлением или нет?Как SQL READUNCOMMITTED ведет себя на VIEWS?
ответ
Изоляция предназначена только для таблицы, к которой она относится.
Рассмотрите следующее. В одной сессии, настроить таблицу и вид:
create table x (a int, b varchar(10))
create table y (c int, d varchar(10))
insert into x (a, b) values (1, 'Q')
insert into x (a, b) values (2, 'W')
insert into x (a, b) values (3, 'E')
insert into y (c, d) values (1, 'A')
insert into y (c, d) values (2, 'S')
insert into y (c, d) values (3, 'D')
create view v_test
as
select x.a, x.b, y.d
from x with (readuncommitted)
inner join
y
on x.a = y.c
Выберите из вида из сессии1:
выберите * из v_test
a b c
---- ---- ----
1 Q A
2 W S
3 E D
Теперь откройте еще одну сессию, и огонь вверх транзакция, только обновление x сначала:
begin transaction
update x
set b = 'R'
where a = 1
Вернитесь к сеансу 1 и выполните представление. Теперь вы получите следующее:
a b d
---- --- ---
1 R A
2 W S
3 E D
Обратите внимание на новое значение для b в первой строке.
Вернуться к сессии 2, с транзакцией еще открытым, обновление у:
update y
set d = 'F'
where c = 1
, а затем попытаться запрашивая мнение обратно в сессии 1:
select *
from v_test
(Вы найдете его как представляется, занимает довольно много времени.)
С выполнением запроса вернитесь к сеансу 2 и совершите транзакцию:
(сессии2 выглядит, как это сейчас:
begin transaction
update x
set b = 'R'
where a = 1
update y
set d = 'F'
where c = 1
commit
)
Оглянитесь на сессии1, и результаты будут теперь появляться с этим:
a b d
--- --- ---
1 R F
2 W S
3 E D
с новым значением для г в первом ряд.
Итак, длинный рассказ немного длиннее, WITH (READUNCOMMITTED) не размножается.
Я думаю, что это был дан ответ, наоборот, здесь: "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" and views
Но они могли бы неправильно, я не сделал свои шаги: еще Патрик, если вы правильно, то вы должны сообщить люди на это нить!
Если вы запустили пример из patrick с readuncommitted в обеих таблицах, вы увидите, что он будет работать, даже когда транзакция выполняется. . Вы также можете запустить пример без того, чтобы он был прочитан в представлении, но передал с помощью readuncommitted на выбор из представления, и он будет распространяться до выбора в представлении, если он передан в представление. ex. выберите * от v_test с (прочитанным)