DML 문의 처리과정(트랜잭션 내부작업)
DML 문의 처리과정
==================
1. 해당 트랜잭션에 대해 언두 세그먼트를 할당한다. 이 경우 현재 온라인 상태인 언두 세그먼트 중
하나를 우선적으로 사용한다. 언두 세그먼트의 선택은 랜덤하게 이루어지며, 다른 트랜잭션이 사용
중이면 3번까지 재시도 한다.(undo segment는 block 단위로 owner ship을 갖는다.)
이 과정에서 실패하면 오프라인 상태의 언두 세그먼트를 온라인화해서 사용한다.
만인 이과정까지 실패하면, 새로운 언두 세그먼트를 생성한다.
위 과정에서 언두 세그먼트를 할당받지 못하면 오라클 8i까지 사용하던 롤백 세그먼트
알고리즘을 사용한다. 즉, 이미 다른 트랜젝션에 의해 사용 중인 언두 세그먼트 중 가장 사용량이
적은 것을 사용한다. 서버 프로세스가 언두 세그먼트를 획득하는 시점에 적당한 온라인 상태의
언두 세그먼트가 없으면 온라인 상태의 언두 세그먼트가 확보될 때까지
enq: US - contention 이벤트를 대기한다.
2. 언두 세그먼트를 할당받으면, 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯(Transaction table slot)을
생성한다.
3. 트랜젝션 테이블을 생성하고 나면 TXID(Transaction ID)를 생성하고, 현재 트랜잭션에 할당한다.
TXID는 V$TRANSACTION 뷰의 XIDUSN, XIDSLOT, XIDSQN으로 표현되는데, 이 값은 트랜젝션에 할당된
언두 영역의 언두 세그먼트 헤더에 존재하는 트랜잭션 테이블의 정확한 위치를 가리킨다. 트랜잭션은
반드시 언두 영역을 할당받은 다음에 ID를 부여받은 것에 유의하자.
4. 트랜잭션의 대상이 되는 블록들을 버퍼 캐시로 적재하고 블록 헤더의 ITL(Interested Transaction List)에
트랜잭션 엔트리(Transaction Entry)를 등록한다. 만일 ITL에 엔트리를 등록할 공간이 없다면, 공간이
확보될 때까지 enq:TX - allocate ITL entry 이벤트를 대기한다.
5. 변경할 블록들의 변경 정보는 PGA에 체인지 벡터라는 이름으로 저장된다. 보통 하나의 로우가 변경되는 경우
각각 언두 헤더 블록(체인지 벡터#1), 언두 블록(체인지 벡터#2), 데이터 블록(체인지 벡터#3)에 해당하는
체인지 벡터들이 생긴다. 프로세스는 PGA의 체인지 벡터들을 리두 레코드(또는 리두 엔트리)라는 이름으로
리두 버퍼(Redo Buffer)로 복사한다. 리두 버퍼에 변경 내용을 복사하는 과정에서 redo copy 래치, redo
allocation 래치, redo writing 래치를 획득해야 한다. 이 과정에서 래치 경합이 발생하면 각각
latch: redo copy, latch: redo allocation, latch:redo writing 이벤트를 대기한다.
6. 이전 이미지(Before Image)에 대한 정보를 언두 블록에 기록하고, 데이터 블록을 변경한다. 변경된
데이터 블록은 더티(Dirty) 상태가 된다. 또한 변경된 데이터 블록에 대한 CR 블록이 버퍼 캐시에 생성된다.
만일 변경하고자 하는 로우가 현재 다른 트랜잭션에 의해 변경 중(즉 변경 후 아직 트랜잭션이 종료되지 않은
상태)이라면 해당 트랜잭션이 종료되기를 기다려야 하며 enq: TX - row lock contention 이벤트를 대기한다.
7. 커밋이 수행되면, 트랜잭션에 SCN을 할당한다. 커밋 정보는 리두 버퍼에 저장된다.
8. 언두 세그먼트 헤더의 트랜잭션 테이블에 커밋이 이루어졌음을 저장하고, 락을 포함한 모든 리소스에 대한 점유를
해제한다.
9. 리두 버퍼의 내용이 리두 로그 파일에 기록된다. 변경된 블록들은 이후 DBWR에 의해 데이터 파일로 기록된다.
출처 - http://support.dbworks.co.kr/index.php?document_srl=3593&mid=ora_tb
트랜잭션 내부작업 진행 9단계
1. 해당 트랜잭션에 대해 언두 세그먼트를 할당.
2. 언두 세그먼트에 트랜잭션 테이블 슬롯을 생성.
3. TXID(transaction ID) 생성
SQL> delete scott.emp;
SQL> select xidusn, xidslot, xidsqn from v$transaction;
4. 블록헤더의 ITL에 트랜잭션 엔트리를 등록, ITL에 공간이 없다면 enq:TX – allocate ITL entry 이벤트 대기
5. 변경정보는 PGA에 체인지 벡터라는 이름으로 저장된다. 언두헤더블록, 언두블록,데이터블록 프로세스는 PGA의 체인지 벡터들을 리두 레코드라는 이름으로 리두버퍼에 복사한다.
6. 이전 이미지에 대한 정보를 언두 블록에 기록하고, 변경된 데이터 블록에 대한 CR블록이 버퍼캐시에 생성된다. 만일 다른 트랜잭션에 의해 변경 중이라면 종료될 때까지 enq:TX – row lock contention 이벤트 대기
7. 커밋이 수행되면, 트랜잭션에 SCN을 할당, 커밋 정보는 리두버퍼에 저장
8. 언두 세그먼트헤더의 트랜잭션 테이블에 커밋정보를 저장, 락을 포함한 리소스에 대한 점유 해제
9. 리두버퍼의 내용이 리두 로그파일에 기록된다
출처 - http://salme.tistory.com/1