아래는 블록 헤더에 exclusive 모드로 찍는 것까지 한 이후의 이야기
(execute 단계)
래치 : 공유 메모리를 보호하는 개념
락 : 객체 보호
★ 트랜잭션 Transaction 처리
- 트랜잭션이란: DML 작업을 하나로 묶어서 처리하는 작업 단위
- 트랜잭션이 발생하면
1. 언두 세그먼트 undo segment 를 할당받는다.
언두 세그먼트를 할당받지 못하면 할당받을 때까지 기다려야 하는데
이때 발생하는 대기이벤트가 enq: US - contention
2. 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯 만들기
트랜잭션 테이블 슬롯 = 트랜잭션 정보를 저장하는 곳
TX slot: 블록 안의 어떤 row 를 트랜잭션 작업해야 하는지 관리
TX slot 이 어떤 언두 세그먼트를 사용하고 있는지 관리 > 언두 세그먼트도 어디서 트랜잭션 작업이 일어나는지 관리
(서로 포인팅하고 있다)
여기서 TXID (Transaction ID) 를 할당받는다.
3. 트랜잭션 대상이 되는 블록을 DBC 에서 찾는다.
블록 헤더의 ITL (Interested Transaction List) 에 transaction entry 등록
(ITL = 트랜잭션 슬롯을 만드는 층)
트랜잭션 슬롯은 테이블 생성시에 결정된다.
select * from dba_tables; 에서
init_trans = 동시에 발생할 수 있는 트랜잭션 수의 초기값 (데이터블록에 동시에 접근 가능한 트랜잭션의 초기 수)
트랜잭션이 많지 않은 경우 낭비하게 되므로 굳이 크게 설정할 이유는 없다.
max_trans = 동시에 발생할 수 있는 트랜잭션 수의 최대값
만약 ITL 에 entry 를 등록할 공간이 없다면 > 공간을 확보할 때까지 대기해야 한다.
이때 발생하는 대기이벤트가 enq: TX - allocate ITL entry
위의 대기이벤트가 너무 많이 발생하면 > 트랜잭션이 많이 발생하는 테이블을 찾아
해당 테이블의 블록 헤더 트랜잭션 레이어에 쓰든 안 쓰든 트랜잭션 슬롯 10개 만들기
> 공간 낭비 가능성 있음 > pct_free 를 10 으로 지정해놓고 transaction slot 이 만들어질 수 있도록 하면 된다.
4. 변경할 블록들의 변경 정보를 PGA 영역에서 change vector 로 만들기
change vector = 이력 정보 = 보통 3개가 만들어짐
이 안에는
- 언두 세그먼트 정보 (change vector 1)
- 이전 값을 저장해야 할 언두 블록 (change vector 2)
- 트랜잭션 대상이 되는 블록 (change vector 3)
가 들어 있다. 이렇게 체인지 벡터를 만들고 나서
PGA 영역 안에 change vector 정보를 redo entry 라는 이름으로 redo log buffer 로 복사한다.
이때 redo copy latch, redo allocation latch, redo writing latch 를 획득해야 하는데
이 과정에서 래치 경합이 발생하면
latch: redo copy / latch: redo allocation / latch : redo writing 이라는 대기이벤트가 발생한다.
5. 이전 이미지 (이전값) 에 대한 정보를 언두 블록에 기록하고 데이터 블록을 변경한다.
변경된 블록은 더티 상태가 된다 > 변경된 블록 헤더에 CR(Consistent Read) 표시를 해놓는다.
(읽기 일관성으로 읽어들여야 하는 블록이라는 뜻)
6. 변경하는 row 에 대해서 lock 을 생성한다. (row level lock)
다른 유저가 해당 행에 lock 을 걸고 있으면 > 기다려야 한다.
이때 발생하는 대기이벤트가 enq: TX row lock contention
★ commit 을 수행하면
- SCN 번호가 할당된다.
- 커밋 정보를 리두로그 버퍼에 저장한다.
- 언두 세그먼트 헤더의 트랜잭션 테이블에 커밋이 완료되었다는 정보를 저장한다.
- transaction entry 해제, lock 해제
- 리두로그 버퍼의 내용을 리두로그 파일에 기록한다. (LGWR 작업 발생)
※ enq: HW - contention 발생
인서트 작업이 물밀듯이 들어올 때, 대량의 데이터가 부어넣어질 때 주로 발생
2024년 2월 7일 5교시 (0) | 2024.02.07 |
---|---|
2024년 2월 7일 4교시 (0) | 2024.02.07 |
2024년 2월 2일 6교시 실행계획 무효화 (0) | 2024.02.02 |
2024년 2월 2일 5교시 (0) | 2024.02.02 |
2024년 2월 2일 4교시 오전에 배운 내용 복습 (0) | 2024.02.02 |