- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=3902424&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
읽기 일관성 구현 (Dirty Read 방지)
DBMS 읽기 일관성 구현 방법 비고 오라클 Undo 완벽함(ORA-1555) 다른 DBMS Row Lock 안완벽함(일관성, 동시성등 문제) 다른 DBMS 의 문제 데모
계좌번호 1 2 3 4 5 6 7 8 9 10 잔고 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,000 - 데모 #0
TX1> select sum(잔고) from 계좌;
- 데모 #1 - 레코드가 추가된 위치에 따라서 총합계가 달라진다.
TX2> insert into 계좌 (계좌번호, 잔고) values ( 11, 1000 ); TX2> commit;
- 데모 #2 - 레코드의 순서와 TX1, TX2 의 실행 순서에 따라서 총합계가 달라진다.
TX2> update 계좌 set 잔고 = 잔고 + 100 where 계좌번호 = 7; TX2> update 계좌 set 잔고 = 잔고 - 100 where 계좌번호 = 3; TX2> commit;
- 데모 #0
다른 DBMS 의 문제 대안
대안(트랜잭션 고립화 수준 변경) 설명 비고 Level 1, Read Committed (기본) 값을 읽는 순간에만 Shared Lock 다른 트랜잭션에 의해 Exclusive Lock 된 Row 는 못 읽음(동시성), 트랜잭션 진행중에 읽고 지나간(Shared Lock 이 해제된) Row 에 다른 트랜잭션이 변경 가능(일관성) Level 2, Repeatable Read 트랜잭션이 완료될 때 까지 Shared Lock 교착상태 유발 Table-level Lock 동시성 저하
Consistent 모드 블록 읽기 (Multi-Version Read Consistency Model)
쿼리가 시작된 시점 1 을 기준으로 데이터를 읽음
- 변경이 발생한 블록은(쿼리 SCN 4 보다 블록 SCN 3 이 큰 블록은) Current 블록 2 으로부터 CR 블록을 생성해서 읽는다.
- ( Current 블록 2 : CR 블록 ) = ( 1 : N )
- RAC 환경에서 Current 블록이 노드 숫자만큼 생길 수(캐싱될 수) 있으나, Exclusive 모드의 Current 블록은 한개다. (Shared(S), Exclusive(X), Null(N) 모드)
- ( Current 블록 2 : CR 블록 ) = ( 1 : N )
- 시점 1 은 SCN 4 (System Commit Number) 로 식별 (v$database.current_scn) : 일관성, 동시성, Redo Log 정보 순서 식별, 데이터 복구
- 블록 SCN 3 (System Change Number) : 블록이 마지막으로 변경된 시점 정보
- 변경이 발생한 블록은(쿼리 SCN 4 보다 블록 SCN 3 이 큰 블록은) Current 블록 2 으로부터 CR 블록을 생성해서 읽는다.
Consistent 모드 블록 읽기의 세부 원리
SCN 5 확인 후 읽기 작업을 한다.
- SCN 5 : 쿼리 SCN or 스냅샷 SCN
- Current 블록 SCN <= 쿼리 SCN 인 블록만 읽기 가능
Current 블록 상태에 따른 Consistent 모드 블록 읽기
Current 블록 상태 SCN 상태 읽기 동작 COMMITTED Current 블록 SCN <= 쿼리 SCN 바로 읽음 COMMITTED Current 블록 SCN > 쿼리 SCN CR 블록 생성 후 읽음 ACTIVE 쿼리 SCN 이전에 커밋됨 바로 읽음 ACTIVE 쿼리 SCN 이후에 커밋 되었거나 커밋 안됨 CR 블록 생성 후 읽음 - Current 블록 상태가 ACTIVE 인 경우, 오라클은 Delayed 블록 클린아웃 하기 때문에 트랜잭션 테이블 까지 확인을 해야 함.
- CR 블록 생성에 필요한 Undo 정보가 없는 경우 ORA-1555 발생
IMU (In-Memory Undo)
장점
- Undo 세그먼트 헤더 블록, Undo 세그먼트 블록 버퍼에 대한 래치 경합 및 Pinning 감소
- In-memory undo latch (래치)
파라미터 (10g)
- _in_memory_undo : IMU 사용 여부 (TRUE / FALSE)
- _imu_pools : IMU Pool 수
동작
- Undo 데이터가 Undo 세그먼트가 아닌 Shared Pool 내의 IMU Pool <KTI-UNDO> 에 생성...
- IMU Pool 이 가득차면, 저장된 Undo 데이터를 Undo 세그먼트로 일괄 기록 (IMU Flush)
- 이후 Undo 데이터는 예전처럼 Undo 세그먼트에 저장
DBA당 CR 개수 제한
- _db_block_max_cr_dba (파라미터)
- 블록당 6개 까지만 CR Copy를 허용 (가득 차면 오래된 CR Copy 부터 밀려남)
- LRU 리스트에서 항상 LRU END 쪽에 위치 (메모리 부족시 가장 먼저 밀려남)
참조문서
블로그(오라클 성능 문제에 대한 통찰) : http://ukja.tistory.com/11
서적(오라클 성능 고도화 원리와해법 I) : http://book.daum.net/detail/book.do?bookid=KOR9788996246015
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=3902424&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.