2010-08-05 3 views

답변

1

격리는 적용 대상 인 테이블에만 적용됩니다.

다음을 고려하십시오. session1에서보기에서

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 

선택 : 하나 개의 세션에서 테이블 및보기를 설정 이제 다른 세션을 열고 불

a  b  c 
---- ---- ---- 
1  Q  A 
2  W  S 
3  E  D 

v_test에서

선택 * 트랜잭션, 처음에는 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, 여전히 거래 개방, 업데이트 부착 Y : 다음

update y 
set d = 'F' 
where c = 1 

다시 세션 1에서 뷰를 쿼리하십시오 :

select * 
from v_test 

(당신은 그것을 찾을 수 있습니다 오히려 오랜 시간이 걸릴 것 같습니다.)

쿼리가 여전히 실행 중이면 세션 2로 돌아가 트랜잭션을 커밋하십시오.

,451,515,

는 (세션 2는 이제 다음과 같습니다

begin transaction 

update x 
set b = 'R' 
where a = 1 

update y 
set d = 'F' 
where c = 1 

commit 

)

을 session1 다시보고 결과가 지금이 나타납니다 : 처음에 D에 대한 새로운 값

a  b  d 
---  ---  --- 
1  R  F 
2  W  S 
3  E  D 

을 열.

그래서 길게 이야기하면 WITH (READUNCOMMITTED)가 전파되지 않습니다.

0

내가 여기, 반대로,이 대답이라고 생각 : "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" and views

그러나 그들은 잘못되었을 수 있습니다, 당신이 올바른 있다면 다음에 사람들 알려야한다, 당신의 단계 아직 패트릭을하지 않은 그 스레드!

0

두 테이블 모두에서 readuncommitted을 사용하여 patrick에서 예제를 실행하면 트랜잭션이 진행 중일 때에도 작동합니다. 보기와 함께 readuncommitted with를 사용하지 않고 예제를 실행할 수도 있지만 readuncommitted를 뷰에서 select로 전달하면 뷰에 전달 된 경우 뷰의 select로 전달됩니다. 예. select * with v_test (readuncommitted)

관련 문제