2014-05-15 5 views
0

12 시간 전 sql * 플러스를 사용하여 친구들과 함께 등록한 모든 사람들에게 복권을 제공한다고 생각해보십시오. 각 행에 이름 목록 만 표시하는 시간 소인을 저장할 열은 없습니다. 사람 m1이 이미 11시 59 분 전에 티켓을 삽입하고 커밋했습니다.오라클 트랜잭션 및 일관성 유지

11:59에 자신의 하녀를 추첨 목록에 추가합니다 (행을 바꿔야 함). insert 문을 실행하는 또 다른 사람 m2가 11:59에 자신의 첫 번째 삽입을 시작합니다 (커밋해야 함). 2 천만 행의 거대한 테이블.

이제 12입니다. 읽기 커밋 된 격리 수준으로 간주합니다.

추첨 배치가 시작되어 등록 된 사용자를 다른 테이블로 이동했습니다. 그 다음 (아주 다음 나노 초), m1과 m2 모두 커밋됩니다.

내 select 문에 m1의 하녀 및 m2가 포함 된 m1을 복권 당첨자 목록에 추가 할 것인가?

응답 중에 scn (시스템 변경 번호), 팬텀 및 반복 불가능 읽기를 고려하십시오.

답변

2

아니요. SQL을 실행하자마자 Oracle 서버는 세션에 대한 데이터 스냅 샷을 유지하므로 더 이상의 커밋은 읽기 SQL에 표시되지 않습니다.

+0

여기에 SCN의 역할을 설명해 주시겠습니까? 그림 13-1 트랜잭션 및 읽기 일관성 http://docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm m2 블록은 많은 SCN을 갖지만 롤백은 찾을 수 없습니다. 그러면 오라클이이 문제를 어떻게 결정합니까? – cdummy

+0

오라클은 독서 과제까지 SCN을 각 트랜잭션에 할당합니다. 따라서 블록을 읽을 때 엔진은 높은 SCN으로 블록을 건너 뜁니다. 블록이 대체되고 더 높은 SCN을 가지면 엔진은 롤백 세그먼트에서 이전 블록을 찾습니다. 블록을 자동으로 RBS에 넣습니다. 읽기 세션이 길어질수록 Oracle은 일관된 스냅 샷을 제공하기 위해 RBS에 더 많은 데이터를 가져올 수 있습니다. m2와 같은 새로운 블록의 경우 오라클은 이전에 데이터가 없으므로 RBS를 질의 할 필요가 없음을 알고 있습니다. –