2009년 7월 25일 토요일

Lock

▣ 개요

데이터 베이스 내부에 정보가 존재하며 모든 인스턴스에서 볼 수 있다.(락은 데이터 베이스 레벨에서 작동)

문맥 교환을 포함한 일련의 명령어들을 사용하여 구현되었다.

6가지 모드로 요청이 가능(null, row share, row exclusive, share, share row exclusive, exclusive)

트랜젝션 동안 지속된다.

프로세스가 락 획득을 실패한 후 해당 요청은 큐(queue)로 관리되며 요청한 순서대로 서비스 된다.(nowait 모드는 예외임)

락은 큐 방식을 사용하며 데드락이 발생될 가능성이 높다. 데드락이 발생될 때 마다 트레이스 파일이 생성된다.

   

용어

Library cache lock

Library cache object (이하 LCO)에 접근 또는 변경 할 때, LCO의 핸들(handle)에 대해 획득하는 락이다. 핸들은 실제 LCO에 대한 메타정보, 포인터 정보를 가지고 있다.

특정 SQL문을 실행하려는 프로세스는 소프트 파싱하는 동안 SQL문에 해당하는 LCO에 대하여 library cache lockshared 모드로 획득해야 한다. 소프트 파싱이 끝나고 나면(실행 또는 하드 파싱 단계) library cache lock을 null 모드로 변환한다. 이 때, SQL문에 해당하는 LCO 이외에 SQL이 참조하는 모든 객체에 대해서도 동일한 모드로 library cache lock을 획득한다.

Library cache pin

Library cache 객체에 대한 수행이나 변경시 library cache object(loc)에 대해 획득하는 락이다. Library cache pin을 획득하는 과정에서 경합이 발생하면 library cache pin 이벤트를 대기한다.

Library cache object의 실행정보를 보호

Row cache lock

오라클은 딕셔너리의 정보를 SGA내의 Row Cache(혹은 dictionary cache)영역에 저장하고 있다.

Row Cache Object(이하 RCO)는 개별 딕셔너리 객체를 의미한다

Row cache object를 변경하고자 할 때 획득하는 락.

Row Cache는 Shared Pool 영역에 존재하며 다음과 같은 쿼리로 확인할 수 있다.

  

TX

행 레벨 잠금

*Insert, update, delete, select…for update 에 의해 수정된 각 행에 대해 자동으로 행 레벨의 lock(Tx)이 설정된다.

*row level lock은 다른 어떠한 사용자도 동시에 동일한 행을 수정할 수 없도록 보장된다. 따라서 다른 사용자에 의해 수정되었지만 아직 commit되지 않은 행을 사용자가 수정할 위험이 없다.

TM

테이블 레벨 잠금

* 테이블 레벨 잠금(TM유형)은 테이블을 수정하는 모든 DML 트랜젝션에 대해 설정된다.

* insert, update, delete, select..for update, lock table

*테이블 잠금은 D이 작업이 트랜젝션과 충돌하지 못하도록 막는다.

UL

PL/SQL user lock, pl/sql 사용자 잠금(lock)

User lock. A session has taken a lock with the DBMS_LOCK.REQUEST function

US

세그먼트를 온라인 또는 오프라인시키는 과정을 동기화하기 위해 해당 작업을 수행하는 서버 프로세스나 백그라운드 프로세스는 US 락을 획득해야 한다. US 락은 언두 세그먼트마다 하나씩 할당되며, ID1=Undo Segment#이다. US 락을 획득하는 과정에서 경합이 발생하면 enq: US - contention 이벤트를 대기하게 된다.

  

HW

HWM(High Water Mark)을 여러 프로세스가 동시에 변경하는 것을 막기 위한 락을 HW락이라고 부른다. HWM을 이동시키고자 하는 프로세스는 반드시 HW락을 획득해야 한다. HW락을 획득하는 과정에서 경합이 발생하면 enq: HW - contention 이벤트를 대기한다. HW락 경합은 대부분 대량 Insert에 의해 발생하며, 간혹 대량 Update에 의해 언두 세그먼트에서 HW락 경합현상이 발생하는 경우도 있다.

SQ

메모리에 캐시되어 있는 범위 안에서 sequence.nextval 을 호출하는 동안 획득한다. CACHE 속성을 부여한 시퀀스에서 사용된다.

  

SV

RAC에서 노드간에 순서가 보장된 상태로 sequence.nextval 을 호출하는 동안 획득한다. CACHE + ORDER 속성을 부여한 시퀀스에서 사용된다.

  

TT

Temp table

오라클 8i 이전 버전에서는 TT 락ST 락처럼 인스턴스 별로 하나만 존재했으며, 인스턴스 기동 시에 롤백 세그먼트를 할당할 때 획득한다. 하지만 오라클 8i 부터는 기존에 ST 락을 사용하던 일부 테이블스페이스 관련 작업에 TT 락을 사용한다.

   

  

Buffer lock

  • 여러 프로세스가 동시에 인서트를 수행하는 경우 오른쪽 말단 리프 노드가 핫 블록이 될 가능성이 높아진다. 핫 블록은 버퍼 락(Buffer Lock) 경합을 유발

   

▣ Lock Mode

모드

의미

Null

리소스에 대한 변경이 있을 경우 락 홀더에게 변경 사실 전달

Sub-shared(RS/SS)

리소스의 일부분에 대한 shared 락이 필요한 경우

Select…for update 문을 사용하는 질의 동안 행을 잠그도록 선택할 수 있다.

이 모드는 다른 트랜젝션들이 동일한 테이블의 다른 행을 동시에 질의, 삽입, 갱신, 삭제 하거나 잠글 수 있도록 허용하고 다른 트랜젝션들이 독점 읽기 또는 쓰기를 위해 테이블을 수동으로 잠그는 것을 막는다.

Sub-Exclusive(RX/SX)

리소스의 일부분에 대한 exclusive 락이 필요한 경우

다른 트랜젝션들이 동일한 테이블의 다른 행을 동시에 insert, update, delete 하거나 잠글 수 있도록 허용하고 다른 트랜젝션들이 독점 읽기 또는 쓰기를 위해 테이블을 수동으로 잠그는 것을 막는다.

Shared(S)

리소스에 대한 변경을 막을 경우

Shared-Sub-Exclusive(SRX/SSX)

리소스의 일부분에 대해서는 exclusive락이, 리소스 전체에 대해서는 shared 락이 필요한 경우

획득된 수동 공유 잠금 모드와 DML문을 막는 훨씬 높은 레벨의 잠금

암시적으로 공유 행 독점 잠금(lock)을 얻은 SQL 문은 다시 참조 무결성과 연관된다.

Exclusive(X)

리소스에 대한 변경이 필요한 경우

최고 레벨의 테이블 잠금이기 때문에 가장 제한적인 모드로서 다른 트랜젝션이 테이블을 질의하는 것만 허용한다. 모든 유형의 DML과 수동 잠금 모드를 허용하지 않는다.

타임아웃시간

Enqueue lock

3초

Buffer lock

일반적인 경우에는 1초, 연속적으로 buffer lock을 획득하기 위해 대기하는 시간은 3초

Row cache lock

60초

Library cache lock/library cache pin

일반 프로세스는 3초, PMON 프로세스는 1초

 

댓글 없음:

댓글 쓰기