#엔큐

엔큐의 개념

{info:title=엔큐(Enqueue)}
대기열을 이용하여 자원의 동시성을 관리하는 메커니즘 (엔큐 메커니즘을 이용한 락)
{info}
엔큐 락 종류
구분정보예제
{code:noneborderStyle=solid}사용자 엔큐 락{code}사용자에 의해 발생TM(테이블), TX(행), UL(사용자 정의)
{code:noneborderStyle=solid}관리 엔큐 락{code}데이터베이스 관리 목적, 사용자 엔큐 락을 제외한 모든 엔큐 락
엔큐 락 데모1
세션구분명령어발생락엔큐비고
세션1{code:sqlborderStyle=solidborderColor=red}LOCK TABLE 사원 IN SHARE MODE;{code}TM-S 적용①TM-S 적용됨
세션2{code:sqlborderStyle=solid}UPDATE 사원 SET 이름 = '강감찬' WHERE 사번 = 1111;{code}TM-RX, TX-X 적용②큐에서 대기③세션1 의 TM-S 와 호환되지 않음
세션3{code:sqlborderStyle=solid}SELECT * FROM 사원 WHERE 사번 = 1112 FOR UPDATE;{code}TM-RX, TX-X 적용④큐에서 대기⑤세션1 의 TM-S 호환되지 않음
엔큐 락 데모2
세션구분명령어발생락엔큐비고
세션1{code:sqlborderStyle=solid}ROLLBACK;{code}TM-S 해제⑥TM-S 해제됨
세션2{code:sqlborderStyle=solidborderColor=red}UPDATE 사원 SET 이름 = '강감찬' WHERE 사번 = 1111;{code}TM-RX, TX-X 적용⑦TM-RX, TX-X 적용됨
세션3{code:sqlborderStyle=solidborderColor=red}SELECT * FROM 사원 WHERE 사번 = 1112 FOR UPDATE;{code}TM-RX, TX-X 적용⑧세션2 의 TM-RX 와 호환됨




엔큐 락 적용 메커니즘

{info:title=엔큐 메커니즘은}
SGA에 존재하는 자원 구조체와 락 구조체를 이용
{info}
자원 구조체, 락 구조체
구분정보QLRH
{code:noneborderStyle=solid}자원 구조체(Resource Structure){code}엔큐마다 각 자원 구조체 보유
  • 소유자 리스트: 락을 획득하고 있는 세션 정보 및 획득하고 있는 락 모드를 기록
  • 대기자 리스트: 락을 획득하기 위해 대기하는 세션의 정보 및 획득하려는 락 모드를 기록
  • 변경자 리스트: 이미 획득한 락 모드를 변경하려고 대기하는 세션 정보 및 변경하려는 락 모드를 기록
{code:noneborderStyle=solid}락 구조체(Lock Structure){code}실질적인 큐 역할을 수행각 자원 구조체 마다 세개(소유자,대기자,변경자 리스트)의 락 구조체를 보유

※ 자원 구조체의 초기 수는 _ENQUEUE_RESOURCE 파라미터에 정의됨, X$KSQRS / V$RESOURCE 에서 정보 확인

엔큐 락의 종류
타입자원타입자원
BL버퍼 캐시 해시 테이블CF컨트롤 파일 트랜잭션
CI교차 인스턴스 함수 호출CU커서 바인드
DF데이터 파일DL다이렉트 로더 병렬 인덱스 생성
DMDB 마운트DR분산 복구 프로세스
DX분산 트랜잭션FB블록 포멧
FS파일 셋HW고수위 마크
IN인스턴스 번호IR인스턴스 복구
IS인스턴스 상태IV라이브러리 캐시 무효화
JQ잡 큐KK리두 쓰레드 킥
L[A-P]라이브러리 캐시 락MR미디어 복구
N[A-Z]라이브러리 캐시 핀PF패스워드 파일
PI패러럴 프로세스 슬레이브PR프로세스 스타트업
PS패러럴 프로세스 동기화Q[A-Z]로우 캐시
RT리두 쓰레드SCSCN(시스템 커밋 번호)
SMSMONSQ시퀀스 캐시
SR리플리케이션 동기화SS정렬 세그먼트
ST공간 관리 트랜잭션SV시퀀스 번호 값
TA트랜잭션 복구TC테이블스페이스 체크포인트
TM테이블TS임시 세그먼트
TT테이블스페이스TX트랜잭션/행
UL사용자 정의UN사용자 이름
US언두세그먼트WFAWR 플러시
XA인스턴스 분산 락XI인스턴스 등록 락

※ 락 구조체를 이용해 락을 동시에 획득 및 변환 대기할 수 있는 총 세션 수는 _ENQUEUE_LOCKS 파라미터에 정의 됨, X$KSQEQ / V$ENQUEUE_LOCK 에서 정보 확인

자원 구조체 데모1 (엔큐 락 데모1)
테이블락(TM-10-0) 자원 구조체
{code:noneborderStyle=solidborderColor=blue}소유자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}변경자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}대기자(락 구조체){code}
{code:noneborderStyle=solidborderColor=orange}세션1(S){code}{code:noneborderStyle=solidborderColor=orange}세션2(RX){code}    ↓{code:noneborderStyle=solidborderColor=orange}세션3(RX){code}

※ 세션1이 공유(TM-S) 락 적용, 세션2,3이 행 배타적 락(TM-RX) 적용 대기 중

자원 구조체 데모2
테이블락(TM-10-0) 자원 구조체
{code:noneborderStyle=solidborderColor=blue}소유자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}변경자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}대기자(락 구조체){code}
{code:noneborderStyle=solidborderColor=orange}세션1(S){code}{code:noneborderStyle=solidborderColor=orange}세션1(S→X)②{code}{code:noneborderStyle=solidborderColor=orange}세션2(RX){code}    ↓{code:noneborderStyle=solidborderColor=orange}세션3(RX){code}    ↓{code:noneborderStyle=solidborderColor=orange}세션4(S)①{code}

※ 세션4가 공유(TM-S) 락 적용 하려 하나, 세션1의 공유(TM-S) 락 과 비록 호환 되지만 행 배타적 락(TM-RX) 적용 대기 중인 세션2,3 이 대기자 리스트에 있으므로 그 뒤에 대기①
※ 세션1이 공유(TM-S) 락 에서 배타적(TM-X) 락 으로 변경 가능, 세션2,3,4가 대기 하고 있지만 변경자가 우선②

자원 구조체 데모3
테이블락(TM-10-0) 자원 구조체
{code:noneborderStyle=solidborderColor=blue}소유자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}변경자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}대기자(락 구조체){code}
{code:noneborderStyle=solidborderColor=orange}세션1(X)③{code}{code:noneborderStyle=solidborderColor=orange}세션2(RX){code}    ↓{code:noneborderStyle=solidborderColor=orange}세션3(RX){code}    ↓{code:noneborderStyle=solidborderColor=orange}세션4(S){code}

※ 이제 세션1이 배타적(TM-X) 락 이므로, 세션2,3,4 는 계속 대기③

자원 구조체 데모3
테이블락(TM-10-0) 자원 구조체
{code:noneborderStyle=solidborderColor=blue}소유자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}변경자(락 구조체){code}{code:noneborderStyle=solidborderColor=blue}대기자(락 구조체){code}
{code:noneborderStyle=solidborderColor=orange}세션2(RX)④{code}    ↓{code:noneborderStyle=solidborderColor=orange}세션3(RX)④{code}{code:noneborderStyle=solidborderColor=orange}세션4(S){code}

※ 세션1이 락을 해제 하면, 대기자 리스트의 세션2,3 이 행 배타적 락을 적용 하고, 세션4 는 계속 대기④

엔큐 운영 메커니즘

  • 엔큐 대기 세션은 FIFO 방식
  • 호환 가능한 엔큐 락은 동시 적용
  • 변경자 리스트의 엔큐 락 적용은 대기자 리스트의 엔큐 락 적용 보다 우선
  • 대기자 리스트의 세션이 원하는 락 모드가 소유자 리스트의 세션의 락 모드와 호환 되더라도, 대기자 리스트에 앞선 대기 세션이 있다면 대기

엔큐 락 적용 조건

  • 변경자 리스트에 세션이 존재하지 않음
  • 대기자 리스트에 세션이 존재하지 않음
  • 소유자 리스트에 있는 세션이 적용하고 있는 락 모드가 적용하고자 하는 락과 호환




자원 구조체 획득 방법

SGA 에는

여러 개의 자원 구조체가 존재 하며 하나의 렛치(enqueue)로 관리, 해시 버킷을 이용해서 자원 구조체 할당 하며 동시 요청은 랫치(enqueue hash chain)에 의해 관리

  • 엔큐 해시 버킷은 하나 이상의 자원 구조체를 관리하며 _ENQUEUE_HASH 파라미터 수 만큼 존재
  • enqueue hash chain 렛치는 하나 이상의 해시 버킷을 관리 하는 부모/자식 렛치며 _ENQUEUE_HASH_CHAIN_LATCH 파라미터 수 만큼 존재
  • enqueue 렛치는 단독 렛치로 모든 자원 구조체를 관리
{code:noneborderStyle=solidborderColor=red}enqueue hash chain 렛치{code}{code:noneborderStyle=solidborderColor=blue}enqueue 렛치{code}
{code:noneborderStyle=none}↓{code}{code:noneborderStyle=none}↓{code}
{code:noneborderColor=red}엔큐 해시 버킷{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}
{code:noneborderColor=red}엔큐 해시 버킷{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}
{code:noneborderColor=red}엔큐 해시 버킷{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}{code:noneborderColor=blue}자원 구조체[락 구조체]{code}

자원 구조체 획득은

먼저 해시 버킷을 선정 하고, 사용하려는 엔큐 자원 구조체가 있으면 사용, 없으면 생성

자원 구조체 획득 데모1

① 세션1이 테이블(OBJECT_ID=10)에 테이블락(TM) 시도
② enqueue hash chain 렛치 획득 (해시 버킷에 접근을 위함)
③ 해시 알고리즘에 의해 2번 버킷 배정
④ 테이블락(TM) 적용 가능시 적용, 불가능한 경우 대기자 리스트에서 대기
⑤ enqueue hash chain 렛치 획득 해제

자원 구조체 획득 데모2 (필요한 자원 구조체가 없는 경우)

① 세션1이 테이블(OBJECT_ID=10)에 테이블락(TM) 시도
② enqueue hash chain 렛치 획득 (해시 버킷에 접근을 위함)
③ 해시 알고리즘에 의해 2번 버킷 배정, 필요한 엔큐 자원 구조체 없음을 확인
④ enqueue 렛치 획득
⑤ 자원 구조체와 락 구조체 생성 후 락을 적용
⑥ enqueue 렛치 획득 해제
⑦ enqueue hash chain 렛치 획득 해제

※ 일반적으로 엔큐 관련 파라미터는 기본 값으로 사용해도 문제 없음, 문제되는 경우는 엔큐 락을 적용 하고자 하는 자원에 대한 경합임



엔큐 관련 동적 뷰

중요 동적 뷰정보비고
{code:noneborderStyle=solid}V$ENQUEUE_LOCK{code}관리 엔큐와 대기 TX 엔큐 정보
{code:noneborderStyle=solid}V$ENQUEUE_STAT{code}엔큐 별 요청 및 대기 횟수
{code:noneborderStyle=solid}V$LOCK{code}유저/백그라운드 프로세스가 적용 하고 있거나, 적용 하려는 모든 락 정보
{code:noneborderStyle=solid}V$LOCK_OBJECT{code}락이 적용된 오브젝트 정보
  • XIDUSN - 언두세그먼트번호
  • XIDSLOT - 트랜잭션 테이블 슬롯 번호
  • XIDSQN - 트랜잭션 테이블 랩 번호
  • OBJECT_ID - 락이 적용된 오브젝트의 ID
  • SESSION_ID - 락을 적용시킨 세션 ID
{code:noneborderStyle=solid}V$RESOURCE{code}사용 중인 자원 구조체 정보V$LOCK 과 1:M
{code:noneborderStyle=solid}V$RESOURCE_LIMIT{code}자원 구조체 및 락 구조체의 현재, 최대 사용랑 및 초기 설정 값, 최대 사용 가능 값