오라클의 동기화 매커니즘
하나 밖에 없는 리소스를 여러명이 사용하려고 하면 문제가 생김
오라클에서는 래치(Latch)와 락(Lock)을 이용,
두 개의 동기화 매커니즘을 이용해서 리소스를 보호함
래치와 락의 차이점
분류 |
래치(Latch) |
락(Lock) |
목적 |
하나의 목적을 수행 : 메모리 구조 (SGA) 에 대한 배타적인 접근을 위함 (오라클 9i cache buffers chains latch들은 읽기 전용시에 공유 가능) |
두 가지 목적을 수행 : 락 모드가 호환 가능하면 다수의 프로세스가 동일한 리소스를 공유하는 것을 허용 락 모드가 호환 가능하지 않으면 리소스에 대한 배타적인 접근만 허용 |
사용범위 |
SGA 내부의 데이터 구조에만 적용 메모리 오브젝트를 임시적으로 보호함 단일 오퍼레이션으로 메모리 구조에 대한 접근 제어. 트랜잭션 단위가 아님 |
테이블, 데이터 블록 및 state object와 같은 오브젝트를 보호함 데이터베이스의 데이터 또는 메타데이터 접근 제어 트랜잭션 단위 |
획득방식 |
두 가지 모드로 요청 가능 willing-to-wait no-wait |
6가지 모드로 요청 가능 null, row share, row exclusive, share, share row exclusive 또는 exclusive |
범위 |
SGA 내부에 정보가 존재, 로컬인스턴스에서만 볼 수 있음 래치는 인스턴스 레벨로 작동 |
데이터베이스 내부에 정보가 존재 모든 인스턴스에서 볼 수 있음 락은 데이터베이스 레벨에서 작동 |
복잡도 |
단순한 명령어를 사용하여 구현됨 일반적으로 test-and-set, compare-and-swap 또는 단순한 CPU 명령어. 구현이 쉬움
|
문맥 교환(context switch)을 포함한 일련의 명령어들을 사용하여 구현됨 구현이 복잡함 |
지속기간 |
아주 짧은 순간만 지속됨 (microsecond 단위 - 종류에 따라 다르지만 대체 2초를 기다림) |
일정 시간 동안 지속됨 (트랜잭션 동안) -커밋 안되면 계속 락 걸려있음 |
큐(Queue) |
프로세스가 래치 획득을 실패한 후 슬립(Sleep) 상태로 들어갈 때, 해당요청은 큐(queue)로 관리되지 않으며, 요청한 순서대로 서비스되지 않음 (latch wait list를 이용해 큐 방식으로 사용되는 래치들은 예외임) 대부분 래치는 먼저 온 놈이 임자, 순서 보장 안함 |
프로세스가 락 획득을 실패한 후, 해당 요청은 큐(queue)로 관리되며, 요청한 순서대로 서비스됨 (NOWAIT 모드는 예외임) 순서 보장함 |
데드락 |
래치는 데드락(deadlock)이 발생되지 않도록 구현됨 |
락은 큐(queue) 방식을 사용하며, 데드락이 발생될 가능성이 높음 데드락이 발생될 때마다 트레이스 파일이 생성됨 |