이 사이트는 쿠키를 사용합니다. 계속함으로써,당신은 그들의 사용에 동의합니다. 쿠키를 제어하는 방법을 포함하여 자세히 알아보십시오.
이 문서는 오라클 성능 튜닝 시리즈의 일부이며 오라클의 잠금 메커니즘을 설명하기 위해 작성되었습니다.
잠금은 리소스에 액세스하기 위해 보유해야 하는 리소스입니다. 오라클은 잠금의 두 가지 종류가 있습니다:대기열과 래치,우리는 지금 개별적으로 이러한 잠금 메커니즘에 초점을 맞출 것이다.
큐
큐는 공유 리소스(예:테이블,행,작업,다시 실행 스레드)에 대한 액세스를 관리하기 위한 정교한 잠금입니다. 큐는 다른 레벨/모드에서 요청할 수 있습니다:
- 널
- 행 공유
- 공유
- 공유 행 독점
- 독점
세션이 공유 모드에서 큐를 보유하는 경우,다른 세션도 공유 모드를 취할 수 있습니다.공유 모드에서 대기열(동일한 리소스에 대해). 세션이 독점 모드에서 큐를 보유하고있는 경우,그것을 얻을하고자하는 다른 세션–독립적으로 어떤 수준에서-그들은 기다려야합니다.
세션에서 액세스가 필요한 경우 잠금 구조를 획득하고 특정 레벨(모드)에서 리소스에 대한 액세스를 획득하도록 요청합니다. 잠금 구조는 소유자(큐를 획득 할 수있는 경우),웨이터(세션이 큐를 획득하기를 기다리는 경우)및 변환기(세션이 큐를 보유하고있는 세 가지 링크 된 목록 중 하나에 배치됩니다.
다음은 몇 가지 일반적인 유형의 큐입니다:-
- 티엠-세션이 테이블을 잠그려고 할 때마다 티엠 큐가 요청됩니다. 세션이 부모 테이블의 행을 삭제하고 자식 테이블에 인덱스 없이 참조 제약 조건(외래 키)을 만들거나 세션이 외래 키가 참조하는 열을 업데이트하는 경우 자식 테이블에 대해 공유 잠금이 수행됩니다. 다른 세션이 자식 테이블에 대한 변경을 시도하면 대기열을 행 전용 모드로 원하며 공유 모드와 호환되지 않기 때문에 기다려야합니다.
- 송신–트랜잭션이 시작 되 자마자 송신 큐가 필요합니다. 트랜잭션은 롤백 세그먼트 번호,롤백 세그먼트의 트랜잭션 테이블의 슬롯 번호 및 슬롯 번호의 시퀀스 번호로 고유하게 정의됩니다.
- 다른 세션이 요청된 행 잠금
- 두 세션이 동일한 고유 키를 테이블에 삽입하려고 할 때(커밋을 수행하지 않은 세션)마지막 세션이 첫 번째 세션이 커밋 또는 롤백되기를 기다리고 있습니다.
- 블록 헤더에 자유 거래 목록(관심 거래 목록)이 없습니다.
- 이 경우 세션 잠금이 해제됩니다.요청 기능.
래치
래치는 공유 데이터 구조를 보호하는 낮은 수준의 직렬화 메커니즘을 제공합니다. 래치는 매우 빠르게 획득 및 해제 할 수있는 잠금 유형입니다. 래치는 일반적으로 두 개 이상의 프로세스가 지정된 시간에 동일한 코드를 실행하는 것을 방지하기 위해 사용됩니다. 래치를 획득하면 교착 상태를 방지하기 위해 특정 수준에서 래치를 획득합니다. 프로세스가 특정 레벨에서 래치를 획득하면 이후 해당 레벨과 같거나 작은 레벨에서 래치를 획득할 수 없습니다(지금 획득하지 않는 한). 각 래치와 관련된 것은 래치를 잡고 있는 동안 프로세스가 종료될 경우 호출되는 정리 절차입니다. 이 청소는 전화 서비스를 사용하여 수행됩니다. 래치의 기본 구현은 운영 체제에 따라 다르며,특히 프로세스가 래치를 대기할지 여부와 기간에 따라 다릅니다.
래치의 목표는 한 번에 하나의 프로세스만 구조에 액세스할 수 있도록 공유 데이터 구조에 대한 동시 액세스를 관리하는 것입니다. 차단된 프로세스(래치가 이미 다른 프로세스에서 가져온 코드의 일부를 실행하기를 기다리는 프로세스)는 래치가 해제될 때까지 대기합니다. 오라클은 래치에서 작동하기 위해”테스트 및 설정”과 같은 원자 지침을 사용합니다. 설정 하 고 무료 래치 지침은 원자,운영 체제 보장 단 하나의 프로세스 그것을 가져옵니다 때문에 그것은 단지 하나의 명령,그것은 매우 빠른.
래치 요청은 두 가지 모드로 만들 수 있습니다.:
- 기꺼이 대기:”기꺼이 대기”모드 요청은 래치를 얻을 때까지 반복,대기 및 다시 요청합니다.
- 대기 없음:”대기 없음”모드에서는 프로세스가 래치를 요청하고 사용할 수 없는 경우 대기 대신 다른 래치를 요청합니다. 서버 프로세스가 모두 실패 할 때만 기다려야합니다.
래치 간의 차이&큐
래치와 큐 사이의 한 가지 차이점은 큐는 운영 체제 특정 잠금 메커니즘을 사용하여 얻은 반면 래치는 운영 체제와 독립적으로 얻은 것입니다. 큐를 사용하면 사용자가 잠금(즉,요청 중인 모드)에 값을 저장할 수 있습니다. 운영 체제 잠금 관리자는 잠긴 리소스를 추적합니다. 요청된 모드와 호환되지 않고 잠금이 대기로 요청되어 프로세스가 잠금에 부여될 수 없는 경우,운영체제는 요청 프로세스를 대기 큐에 둔다.
래치와 대기열의 또 다른 차이점은 대기열이 웨이터의 대기열을 유지하고 정렬하는 반면 래치는 유지하지 않는다는 것입니다. 래치를 기다리는 모든 프로세스가 동시에 다시 시도합니다(스케줄러에 따라 다름). 이 웨이터의 래치를 얻을 수 있으며 생각할 래치를 얻기 위해 시도하는 첫 번째 실제로 그것을 얻을 수있는 마지막 하나가 될 수 있음을 의미합니다. 래치 웨이터는 타이머를 사용하여 웨이크 업 및 다시 시도하거나 래치에서 회전하는 것은(멀티 프로세서에서만)중앙 처리 장치를 잡고 짧은 시간에 래치가 해제 될 것으로 예상하여 기다리는 것을 의미 할 수 있습니다.