Lock

지니·2021년 1월 30일
0

SQLP

목록 보기
5/16

Lock 기본

같은 자원을 액세스하려는 다중 트랜잭션 환경에서 데이터베이스의 일관성과 무결성을 유지하기 위해 필요한 직렬화 장치

공유 Lock 과 배타적 Lock

공유 Lock
: 데이터를 읽고자 할 때 사용한다.
공유 Lock과는 호환되지만 배타적 Lock과는 호환되지 않는다.
(공유 Lock이 설정된 리소스에 다른 트랜잭션이 추가로 공유 Lock을 설정하는 것은 되지만 배타적 Lock을 설정하는 것은 안된다. 즉, 본인이 리소스를 읽고 있을 때 다른 사용자가 동시에 읽을 수는 있지만 변경은 불가능하다.)

배타적 Lock
: Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지된다.
다른 트랜잭션에 의해 Lock이 설정된 리소스는 그것이 공유 Lock이든 배타적 Lock이든 동시에 설정할 수 없다.

블로킹과 교착상태

블로킹 : Lock 경합이 발생해 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태. 이를 해소하기 위한 방법으로는 커밋(or 롤백) 뿐이다.

Lock에 의한 성능 저하를 최소화하는 방안

  • 트랜잭션의 원자성을 훼손하지 않는 선에서 트랜잭션을 가능한 짧게 정의하려는 노력이 필요하다.
  • 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 설계하는 것도 중요함. 특히, 주간에 대용량 갱신 작업을 수행하면 안된다.
  • 주간에 대용량 갱신 작업을 수행해야 한다면, 블로킹 현상에 의해 사용자가 무한정 기다리지 않도록 적절한 프로그래밍 기법을 도입한다.
  • 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않는다.
  • SQL 문장이 가장 빠른 시간 내에 처리를 완료하도록 하는 것이 Lock 튜닝의 기본이며 효과도 가장 확실하다.

교착상태 : 두 세션이 각각 Lock을 설정한 리소스를 서로 액세스하려고 진행하는 상황. 여러 테이블을 액세스하면서 발생하는 교착상태는 테이블 접근 순서를 같게 처리하면 피할 수 있다.

Oracle Lock

DML Lock : 다중 사용자에 의해 동시에 액세스되는 사용자 데이터의 무결성을 보장해준다.
DDL Lock :
래치 버퍼 Lock : 래치는 SGA에 공유된 각종 자료구조를 보호하기 위해 사용하며, 버퍼 Lock은 버퍼 블록에 대한 액세스를 직렬화하기 위해 사용한다.
라이브러리 캐시 Lock/Pin : Library Cache Object에 접근 또는 변경할 때, LCO의 핸들을 획득하는 Lock.

DML 로우 Lock

두 개의 동시 트랜잭션이 같은 로우를 변경하는 것을 방지한다.
INSERT 시 두 트랜잭션이 Unique 인덱스가 있는 경우 서로 다른 값을 입력하거나 Unique 인덱스가 아예 없으면 로우 Lock 경합은 발생하지 않는다.
SELECT 시 다른 트랜잭션이 변경한 로우를 읽을 때 복사본 블록을 만들어서 쿼리가 시작된 시점으로 되돌려서 읽기 때문에 Lock을 사용할 필요가 없다. (MVCC 모델 사용)
-> DML과 DML, SELECT와 SELECT 간은 서로 방해하지 않는다.

+ MVCC란? : 다중버전 동시성 제어(Multiversion Concurrency Control)의 약자로 스냅샷 격리성 수준이라고도 불린다. 이는 현재 진행 중인 트랜잭션에 의해 변경된 데이터를 읽고자 할 때는 변경 이전 상태로 되돌린 버전을 읽는 것이다.

DML 테이블 Lock

오라클은 현재 트랜잭션이 갱신 중인 테이블 구조를 다른 트랜잭션이 변경하지 못하게 막기 위해서 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이 걸리는 것이 아닌, 자신이 해당 테이블에서 현재 어떤 작업을 수행 중인지를 알리는 일종의 푯말이다.

profile
duckling

0개의 댓글