데이터베이스 Lock 기본 개념

잠금(Lock)은 사용중인 리소스의 무결성을 위해 다른 트랜잭션의 접근을 제한하는 것을 말합니다. 아래에서 설명하는 기본 개념은 표준으로 사용되지만 DBMS마다 제공하는 Lock의 상세 메커니즘은 다르기 때문에 각 DBMS 문서를 확인 해야합니다.

Lock의 기본 개념

image-20211123101054999

종류 설명
공유 잠금
(Shared Lock, s-lock)
- Read Lock이라고도 불리며 읽기 전용 잠금입니다.
- 실행중인 트랜잭션(T1)에서 읽은 데이터를 다른 트랜잭션(T2)에 의해 데이터가 변경되는 것을 방지하기 위해 사용합니다.
- 만약 T1에서 특정 리소스에 공유 잠금을 획득한 상태에서 T2가 동일한 리소스에 배타적 잠금을 요청하면 T1의 공유 잠금이 해제될 때까지 대기합니다.
- 공유잠금은 다른 트랜잭션의 공유 잠금을 블로킹 하지 않습니다.
배타적 잠금
(Exclusive Lock, x-lock)
- Write Lock이라고도 불리며 쓰기 전용 잠금입니다.
- 실행중인 트랜잭션(T1)에서 데이터를 변경할 때 다른 트랜잭션(T2)에서 데이터를 액세스할 수 없도록 합니다.
- 만약 T1에서 특정 리소스에 대해 배타적 잠금을 획득한 상태에서 T2가 동일한 리소스에 공유 잠금 또는 배타적 잠금을 요청하면 T1의 배타적 잠금이 해제될 때가지 대기합니다.
잠금 해제
(UnLock)
- Commit이나 Rollback 연산이 실행되면 트랜잭션이 리소스에 걸어둔 잠금이 해제됩니다.
블로킹
(Blocking)
- 잠금의 경합이 발생해 특정 세션의 작업이 대기하고 있는 상태를 말합니다. 공유잠금인 상태에서 배타적잠금을 요청하거나 배타적잠금인 상태에서 공유잠금 또는 배타적잠금을 요청할 경우 선행 트랜잭션의 잠금이 해제될 때까지 대기하게 되는데 이를 블로킹이라고 합니다.
- 블로킹 해결 방안
   1. 조건절에 인덱스 컬럼을 사용하여 레코드의 스캔 범위를 줄입니다.
   2. 가능한 트랜잭션의 실행시간을 짧게 만들기 위해 작업단위를 최소화하고 SQL을 튜닝합니다.
   3. 정규화를 통해 테이블을 분리하여 트랜잭션의 액세스를 분산 시킵니다.
   4. SELECT...FOR UPDATE WAIT [time], lock_timeout같은 lock에 의해 대기할수 있는 최대 시간을 설정합니다.
   5. Batch 같이 대량의 갱신 작업은 트랜잭션이 적은 새벽에 실행 되도록 합니다.
교착상태
(Dead Lock)
- 두 개의 트랜잭션이 각자 리소스에 잠금을 획득한 상태에서 교차 잠금을 요청하면 블로킹된 상태로 무한정 기다리게 되는 현상을 말합니다.
- 위에 그림 하단에서 처럼 T1이 R1에 잠금을 획득하고 T2이 R2에 잠금을 획득한 상태에서 T1은 R2로 T2는 R1에 교차 잠금을 요청하면 발생됩니다.
- 교착상태 해결 방안
   1. 트랜잭션을 정의할 때 정해진 순서로 리소스에 접근 하도록 규칙을 정합니다.
   2. 교착상태가 발생한 트랜잭션 T1과 T2중 하나를 강제 종료합니다.(대부분 DBMS에서는 자동으로 이 기능을 수행함)
- Dead Lock 로그 확인: SQL Server, Oracle, MySQL

댓글남기기