{info:title=엔큐(Enqueue)} 대기열을 이용하여 자원의 동시성을 관리하는 메커니즘 (엔큐 메커니즘을 이용한 락) {info} |
구분 | 정보 | 예제 | |
---|---|---|---|
{code:none | borderStyle=solid}사용자 엔큐 락{code} | 사용자에 의해 발생 | TM(테이블), TX(행), UL(사용자 정의) |
{code:none | borderStyle=solid}관리 엔큐 락{code} | 데이터베이스 관리 목적, 사용자 엔큐 락을 제외한 모든 엔큐 락 |
세션구분 | 명령어 | 발생락 | 엔큐 | 비고 | ||
---|---|---|---|---|---|---|
세션1 | {code:sql | borderStyle=solid | borderColor=red}LOCK TABLE 사원 IN SHARE MODE;{code} | TM-S 적용① | TM-S 적용됨 | |
세션2 | {code:sql | borderStyle=solid}UPDATE 사원 SET 이름 = '강감찬' WHERE 사번 = 1111;{code} | TM-RX, TX-X 적용② | 큐에서 대기③ | 세션1 의 TM-S 와 호환되지 않음 | |
세션3 | {code:sql | borderStyle=solid}SELECT * FROM 사원 WHERE 사번 = 1112 FOR UPDATE;{code} | TM-RX, TX-X 적용④ | 큐에서 대기⑤ | 세션1 의 TM-S 호환되지 않음 |
세션구분 | 명령어 | 발생락 | 엔큐 | 비고 | ||
---|---|---|---|---|---|---|
세션1 | {code:sql | borderStyle=solid}ROLLBACK;{code} | TM-S 해제⑥ | TM-S 해제됨 | ||
세션2 | {code:sql | borderStyle=solid | borderColor=red}UPDATE 사원 SET 이름 = '강감찬' WHERE 사번 = 1111;{code} | TM-RX, TX-X 적용⑦ | TM-RX, TX-X 적용됨 | |
세션3 | {code:sql | borderStyle=solid | borderColor=red}SELECT * FROM 사원 WHERE 사번 = 1112 FOR UPDATE;{code} | TM-RX, TX-X 적용⑧ | 세션2 의 TM-RX 와 호환됨 |
{info:title=엔큐 메커니즘은} SGA에 존재하는 자원 구조체와 락 구조체를 이용 {info} |
구분 | 정보 | QLRH | |
---|---|---|---|
{code:none | borderStyle=solid}자원 구조체(Resource Structure){code} | 엔큐마다 각 자원 구조체 보유 |
|
{code:none | borderStyle=solid}락 구조체(Lock Structure){code} | 실질적인 큐 역할을 수행 | 각 자원 구조체 마다 세개(소유자,대기자,변경자 리스트)의 락 구조체를 보유 |
※ 자원 구조체의 초기 수는 _ENQUEUE_RESOURCE 파라미터에 정의됨, X$KSQRS / V$RESOURCE 에서 정보 확인
타입 | 자원 | 타입 | 자원 |
---|---|---|---|
BL | 버퍼 캐시 해시 테이블 | CF | 컨트롤 파일 트랜잭션 |
CI | 교차 인스턴스 함수 호출 | CU | 커서 바인드 |
DF | 데이터 파일 | DL | 다이렉트 로더 병렬 인덱스 생성 |
DM | DB 마운트 | 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 | 리두 쓰레드 | SC | SCN(시스템 커밋 번호) |
SM | SMON | SQ | 시퀀스 캐시 |
SR | 리플리케이션 동기화 | SS | 정렬 세그먼트 |
ST | 공간 관리 트랜잭션 | SV | 시퀀스 번호 값 |
TA | 트랜잭션 복구 | TC | 테이블스페이스 체크포인트 |
TM | 테이블 | TS | 임시 세그먼트 |
TT | 테이블스페이스 | TX | 트랜잭션/행 |
UL | 사용자 정의 | UN | 사용자 이름 |
US | 언두세그먼트 | WF | AWR 플러시 |
XA | 인스턴스 분산 락 | XI | 인스턴스 등록 락 |
※ 락 구조체를 이용해 락을 동시에 획득 및 변환 대기할 수 있는 총 세션 수는 _ENQUEUE_LOCKS 파라미터에 정의 됨, X$KSQEQ / V$ENQUEUE_LOCK 에서 정보 확인
테이블락(TM-10-0) 자원 구조체 | ||||||||
---|---|---|---|---|---|---|---|---|
{code:none | borderStyle=solid | borderColor=blue}소유자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}변경자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}대기자(락 구조체){code} |
{code:none | borderStyle=solid | borderColor=orange}세션1(S){code} | {code:none | borderStyle=solid | borderColor=orange}세션2(RX){code} ↓{code:none | borderStyle=solid | borderColor=orange}세션3(RX){code} |
※ 세션1이 공유(TM-S) 락 적용, 세션2,3이 행 배타적 락(TM-RX) 적용 대기 중
테이블락(TM-10-0) 자원 구조체 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
{code:none | borderStyle=solid | borderColor=blue}소유자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}변경자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}대기자(락 구조체){code} | ||||
{code:none | borderStyle=solid | borderColor=orange}세션1(S){code} | {code:none | borderStyle=solid | borderColor=orange}세션1(S→X)②{code} | {code:none | borderStyle=solid | borderColor=orange}세션2(RX){code} ↓{code:none | borderStyle=solid | borderColor=orange}세션3(RX){code} ↓{code:none | borderStyle=solid | borderColor=orange}세션4(S)①{code} |
※ 세션4가 공유(TM-S) 락 적용 하려 하나, 세션1의 공유(TM-S) 락 과 비록 호환 되지만 행 배타적 락(TM-RX) 적용 대기 중인 세션2,3 이 대기자 리스트에 있으므로 그 뒤에 대기①
※ 세션1이 공유(TM-S) 락 에서 배타적(TM-X) 락 으로 변경 가능, 세션2,3,4가 대기 하고 있지만 변경자가 우선②
테이블락(TM-10-0) 자원 구조체 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
{code:none | borderStyle=solid | borderColor=blue}소유자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}변경자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}대기자(락 구조체){code} | ||
{code:none | borderStyle=solid | borderColor=orange}세션1(X)③{code} | {code:none | borderStyle=solid | borderColor=orange}세션2(RX){code} ↓{code:none | borderStyle=solid | borderColor=orange}세션3(RX){code} ↓{code:none | borderStyle=solid | borderColor=orange}세션4(S){code} |
※ 이제 세션1이 배타적(TM-X) 락 이므로, 세션2,3,4 는 계속 대기③
테이블락(TM-10-0) 자원 구조체 | ||||||||
---|---|---|---|---|---|---|---|---|
{code:none | borderStyle=solid | borderColor=blue}소유자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}변경자(락 구조체){code} | {code:none | borderStyle=solid | borderColor=blue}대기자(락 구조체){code} |
{code:none | borderStyle=solid | borderColor=orange}세션2(RX)④{code} ↓{code:none | borderStyle=solid | borderColor=orange}세션3(RX)④{code} | {code:none | borderStyle=solid | borderColor=orange}세션4(S){code} |
※ 세션1이 락을 해제 하면, 대기자 리스트의 세션2,3 이 행 배타적 락을 적용 하고, 세션4 는 계속 대기④
엔큐 운영 메커니즘
엔큐 락 적용 조건
SGA 에는
여러 개의 자원 구조체가 존재 하며 하나의 렛치(enqueue)로 관리, 해시 버킷을 이용해서 자원 구조체 할당 하며 동시 요청은 랫치(enqueue hash chain)에 의해 관리
{code:none | borderStyle=solid | borderColor=red}enqueue hash chain 렛치{code} | {code:none | borderStyle=solid | borderColor=blue}enqueue 렛치{code} |
---|---|---|---|---|---|
{code:none | borderStyle=none}↓{code} | {code:none | borderStyle=none}↓{code} | ||
{code:none | borderColor=red}엔큐 해시 버킷{code} | {code:none | borderColor=blue}자원 구조체[락 구조체]{code}{code:none | borderColor=blue}자원 구조체[락 구조체]{code}{code:none | borderColor=blue}자원 구조체[락 구조체]{code} |
{code:none | borderColor=red}엔큐 해시 버킷{code} | {code:none | borderColor=blue}자원 구조체[락 구조체]{code}{code:none | borderColor=blue}자원 구조체[락 구조체]{code}{code:none | borderColor=blue}자원 구조체[락 구조체]{code} |
{code:none | borderColor=red}엔큐 해시 버킷{code} | {code:none | borderColor=blue}자원 구조체[락 구조체]{code}{code:none | borderColor=blue}자원 구조체[락 구조체]{code}{code:none | borderColor=blue}자원 구조체[락 구조체]{code} |
자원 구조체 획득은
먼저 해시 버킷을 선정 하고, 사용하려는 엔큐 자원 구조체가 있으면 사용, 없으면 생성
① 세션1이 테이블(OBJECT_ID=10)에 테이블락(TM) 시도
② enqueue hash chain 렛치 획득 (해시 버킷에 접근을 위함)
③ 해시 알고리즘에 의해 2번 버킷 배정
④ 테이블락(TM) 적용 가능시 적용, 불가능한 경우 대기자 리스트에서 대기
⑤ enqueue hash chain 렛치 획득 해제
① 세션1이 테이블(OBJECT_ID=10)에 테이블락(TM) 시도
② enqueue hash chain 렛치 획득 (해시 버킷에 접근을 위함)
③ 해시 알고리즘에 의해 2번 버킷 배정, 필요한 엔큐 자원 구조체 없음을 확인
④ enqueue 렛치 획득
⑤ 자원 구조체와 락 구조체 생성 후 락을 적용
⑥ enqueue 렛치 획득 해제
⑦ enqueue hash chain 렛치 획득 해제
※ 일반적으로 엔큐 관련 파라미터는 기본 값으로 사용해도 문제 없음, 문제되는 경우는 엔큐 락을 적용 하고자 하는 자원에 대한 경합임
중요 동적 뷰 | 정보 | 비고 | |
---|---|---|---|
{code:none | borderStyle=solid}V$ENQUEUE_LOCK{code} | 관리 엔큐와 대기 TX 엔큐 정보 | |
{code:none | borderStyle=solid}V$ENQUEUE_STAT{code} | 엔큐 별 요청 및 대기 횟수 | |
{code:none | borderStyle=solid}V$LOCK{code} | 유저/백그라운드 프로세스가 적용 하고 있거나, 적용 하려는 모든 락 정보 | |
{code:none | borderStyle=solid}V$LOCK_OBJECT{code} | 락이 적용된 오브젝트 정보 |
|
{code:none | borderStyle=solid}V$RESOURCE{code} | 사용 중인 자원 구조체 정보 | V$LOCK 과 1:M |
{code:none | borderStyle=solid}V$RESOURCE_LIMIT{code} | 자원 구조체 및 락 구조체의 현재, 최대 사용랑 및 초기 설정 값, 최대 사용 가능 값 |