2010-08-05 3 views
0

У меня есть представление, которое содержит объединение нескольких таблиц. Если я использую «WITH (READUNCOMMITTED)» в представлении SELECT FROM, будет ли он распространяться и применяться к таблицам, которые соединены представлением или нет?Как SQL READUNCOMMITTED ведет себя на VIEWS?

ответ

1

Изоляция предназначена только для таблицы, к которой она относится.

Рассмотрите следующее. В одной сессии, настроить таблицу и вид:

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) не размножается.

0

Я думаю, что это был дан ответ, наоборот, здесь: "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" and views

Но они могли бы неправильно, я не сделал свои шаги: еще Патрик, если вы правильно, то вы должны сообщить люди на это нить!

0

Если вы запустили пример из patrick с readuncommitted в обеих таблицах, вы увидите, что он будет работать, даже когда транзакция выполняется. . Вы также можете запустить пример без того, чтобы он был прочитан в представлении, но передал с помощью readuncommitted на выбор из представления, и он будет распространяться до выбора в представлении, если он передан в представление. ex. выберите * от v_test с (прочитанным)