같은 자원을 액세스하려는 다중 트랜잭션 환경에서 데이터베이스의 일관성과 무결성을 유지하기 위해 필요한 직렬화 장치
공유 Lock
: 데이터를 읽고자 할 때 사용한다.
공유 Lock과는 호환되지만 배타적 Lock과는 호환되지 않는다.
(공유 Lock이 설정된 리소스에 다른 트랜잭션이 추가로 공유 Lock을 설정하는 것은 되지만 배타적 Lock을 설정하는 것은 안된다. 즉, 본인이 리소스를 읽고 있을 때 다른 사용자가 동시에 읽을 수는 있지만 변경은 불가능하다.)
배타적 Lock
: Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지된다.
다른 트랜잭션에 의해 Lock이 설정된 리소스는 그것이 공유 Lock이든 배타적 Lock이든 동시에 설정할 수 없다.
블로킹 : Lock 경합이 발생해 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태. 이를 해소하기 위한 방법으로는 커밋(or 롤백) 뿐이다.
교착상태 : 두 세션이 각각 Lock을 설정한 리소스를 서로 액세스하려고 진행하는 상황. 여러 테이블을 액세스하면서 발생하는 교착상태는 테이블 접근 순서를 같게 처리하면 피할 수 있다.
DML Lock : 다중 사용자에 의해 동시에 액세스되는 사용자 데이터의 무결성을 보장해준다.
DDL Lock :
래치 버퍼 Lock : 래치는 SGA에 공유된 각종 자료구조를 보호하기 위해 사용하며, 버퍼 Lock은 버퍼 블록에 대한 액세스를 직렬화하기 위해 사용한다.
라이브러리 캐시 Lock/Pin : Library Cache Object에 접근 또는 변경할 때, LCO의 핸들을 획득하는 Lock.
두 개의 동시 트랜잭션이 같은 로우를 변경하는 것을 방지한다.
INSERT 시 두 트랜잭션이 Unique 인덱스가 있는 경우 서로 다른 값을 입력하거나 Unique 인덱스가 아예 없으면 로우 Lock 경합은 발생하지 않는다.
SELECT 시 다른 트랜잭션이 변경한 로우를 읽을 때 복사본 블록을 만들어서 쿼리가 시작된 시점으로 되돌려서 읽기 때문에 Lock을 사용할 필요가 없다. (MVCC 모델 사용)
-> DML과 DML, SELECT와 SELECT 간은 서로 방해하지 않는다.
오라클은 현재 트랜잭션이 갱신 중인 테이블 구조를 다른 트랜잭션이 변경하지 못하게 막기 위해서 DML 로우 Lock을 설정하기에 앞서 테이블 Lock을 먼저 설정한다.
Lock 모드간 호환성
Null | RS | RX | S | SRX | X | |
---|---|---|---|---|---|---|
Null | O | O | O | O | O | O |
RS | O | O | O | O | O | |
RX | O | O | O | |||
S | O | O | O | |||
SRX | O | O | ||||
X | O |
오라클에서 말하는 테이블 Lock은 테이블 전체에 Lock이 걸리는 것이 아닌, 자신이 해당 테이블에서 현재 어떤 작업을 수행 중인지를 알리는 일종의 푯말이다.