1. Commit 특징

1) 이전 Commit부터 다음 Commit까지를 하나의 Transaction으로 구분
2) Database에서 발생한 변경 작업의 저장 여부 지정
3) 비정상 종료 시에는 PMON 등에 의해 Rollback 처리

2. Commit 구분

1) 명시적 Commit
  • 사용자에 의해 직접 Commit 명령 실행
2) Automatic Commit
  • DDL(Create, Alter, Drop), DCL(Grant, Revoke) 실행 시 자동 Commit
  • Exit 명령에 의한 정상 종료(Application에 따라 다름)
  • 비정상적인 종료, System Failure 시 Automatic Rollback
3) Group Commit
  • 매 Commit 마다 매번 Sync Writes를 수행하지 않고 한꺼번에 Sync Writes를 수행
    ☞ PL/SQL Block에서 반복적으로 Commit이 이루어지는 경우
    ☞ Recursive SQL에 의해서 Commit이 이루어지는 경우
    ☞ 여러 Session에서 동시에 Commit 요청이 오는 경우
  • user commits의 통계 값은 Commit 수와 동일하지만 log file sync 대기는 Sync Writes를 수행하는 시점에만 발생

3. Commit 방식

1) 10gR2부터 Redo Buffer를 Redo Log File에 기록하는 방식 제어 가능
2) Redo Log 기록 시점
  • COMMIT WRITE(WAIT / NOWAIT)(IMMEDIATE / BATCH)
WAIT기존의 Commit 방식. Redo Buffer가 Redo Log에 기록될 때까지 제어권을 Session에 반환하지 않음
NOWAIT제어권이 즉각적으로 Session에 반환(Redo Buffer가 Redo Log에 기록완료 되기 전)
IMMEDIATERedo Buffer 쓰기 작업을 바로 수행
BATCHRedo Buffer 쓰기 작업을 Batch 형태로 로그 파일에 기록
3) 아래와 같이 값 설정 가능
  • ALTER SYSTEM SET COMMIT_WRITE = NOWAIT, BATCH
  • ALTER SESSION SET COMMIT_WRITE = NOWAIT, BATCH

4. Commit과 Block Cleanout

1) Block Cleanout = Commit 시점에 Block에 대한 Transaction 정보와 Lock 정보를 청소(Cleanout) 하는 것을 의미함
2) Regular Commit
  • 해당 Block에 대해 Block Cleanout 실행
  • 해당 Row의 Lock Byte 설정 해제
3) Fast Commit
  • 변경된 데이터가 많은 경우, Commit 시점에 Buffer Cache에 있는 일부 Buffer에 대해서만 Cleanout 수행
  • 나머지 Block들에 대해서는 Undo Segment Header에 "committed" Mark로 Cleanout을 대신함
    ☞ Commit 단축
  • Delayed Block Cleanout 필요
    ☞ 나중에(Delayed) 다른 Session이 해당 Block을 읽을 때 Cleanout 수행

5. Delayed Block Cleanout & Fast Block Cleanout

1) Fast Block Cleanout
  • 버퍼 캐시에 존재하는 블록을 cleanout하는 것이 Fast Block Cleanout
  • 이 방식은 커밋 시 partial cleanout을 수행함
  • partial cleanout은 일부분만을 cleanout 하고 나머지는 해당 블록에 다른 트랜잭션이 수행되었을 때 수행함
2) Delayed Block Cleanout
  • 버퍼 캐시에 변경된 내용이 디스크에 creanout 되지 않고 내려갔다가 특정 Session에서 다시 읽으려고 버퍼 캐시에 올릴 때 Cleanout 하는 방식
  • 하지만 매번 버퍼 캐시로 올릴 때마다 하게 되면 더 부하를 주게 되므로 캐싱되는 시점에 full cleanout을 수행함

문서에 대하여