데이터베이스 Lock에 대해 알아보고 체계적으로 정리해본다.
데이터베이스는 데이터를 영속적으로 저장하는 시스템으로, 여러 사용자가 동시에 같은 데이터에 접근할 때 데이터의 일관성과 무결성을 유지해야 한다.
예를 들어, 잔고가 5000원이 있을때 5000원 주문을 2개 동시에 수행했을 때 하나의 주문만 완료 되어야 한다. 이를 보장하기 위해 DBMS는 Lock 이라는 메커니즘을 사용한다.
✅ Lock이란?
- Lock은 트랜잭션의 순차적 처리를 보장하는 방법이다.
- 트랜잭션은 데이터베이스의 논리적 작업 단위로, 나누어질 수 없는 최소 단위다.
💡 DBMS 마다 Lock의 구현 방식과 세부 메커니즘이 다르므로, 사용하는 DBMS의 Lock 동작 방식을 이해하는 것이 중요
✅ Lock의 종류
📌 공유(Shared) Lock
- 데이터를 읽을 때 사용한다.
- 특징: 다른 공유 Lock과의 동시 접근이 가능하다. 즉, 여러 사용자가 동시에 데이터를 읽을 수 있다.
- 제한: 공유 Lock이 설정된 데이터에 배타 Lock을 설정할 수 없다.
📌 배타(Exclusive) Lock
- 데이터를 변경할 때 사용한다.
- 특징: 트랜잭션이 완료될 때까지 유지되며, 다른 트랜잭션(읽기 포함)이 해당 데이터에 접근할 수 없다.
- 제한: 이미 다른 트랜잭션이 Lock을 설정한 데이터에는 배타 Lock을 설정할 수 없다.
✅ Lock의 설정 범위(Level)
Lock은 적용 범위에 따라 아래와 같이 나뉜다.
범위 | 설명 | 사용 사례 |
데이터베이스 | 전체 데이터베이스를 Lock. 한 세션만 데이터 접근 가능. | DB 버전 업그레이드, 주요 업데이트 시 |
파일 | 데이터베이스 파일(테이블, 행 등이 저장된 물리적 저장소)을 Lock. | 잘 사용되지 않음 |
테이블 | 테이블 전체를 Lock. 테이블의 모든 행에 영향을 주는 변경에 유용. | DDL(create, alter, drop 등) 작업, DDL Lock이라고도 함 |
페이지/블록 | 파일의 일부인 페이지나 블록을 Lock. | 잘 사용되지 않음 |
컬럼 | 컬럼 단위로 Lock. 리소스 소모가 크며 지원하는 DBMS가 적음. | 일반적으로 사용되지 않음 |
행(Row) | 특정 행을 Lock. DML 작업에 가장 많이 사용. | 가장 일반적인 Lock 방식 |
✅ 블로킹(Blocking)
- Lock 간(배타-배타, 배타-공유) 경합으로 인해 특정 트랜잭션이 진행을 멈춘 상태를 말한다.
- 공유 Lock끼리는 블로킹이 발생하지 않지만, 배타 Lock은 블로킹을 유발한다. 블로킹을 해소하려면 이전 트랜잭션이 완료(커밋 또는 롤백)되어야 한다.
- 이후 트랜잭션은 이전 트랜잭션이 끝날 때까지 대기한다
- 이런 경합은 성능에 부정적인 영향을 미치므로, 경합을 최소화해야 한다.
📌 블로킹 최소화를 위한 주의사항
- 트랜잭션의 길이를 너무 길게 설정하지 않는다.
- 같은 데이터를 갱신하는 트랜잭션이 동시에 실행되지 않도록 설계한다.
- 트랜잭션 격리성 수준을 불필요하게 높게 설정하지 않는다.
- 쿼리가 오랜 시간 Lock을 점유하지 않도록 튜닝한다.
- DBMS에 따라 Lock 대기 시간을 설정할 수 있다.
✅ 교착상태(Deadlock)
- 두 트랜잭션이 각각 Lock을 설정한 상태에서 서로의 Lock에 접근하려고 할 때, 양쪽 모두 영원히 진행하지 못하는 상태를 말한다.
예를 들어, game_master와 game_detail 테이블이 있다고 하자.
트랜잭션 A가 game_master의 5번 행을 수정한 뒤 , game_detail의 5번 행을 수정하려고 한다.
동시에 트랜잭션 B는 game_detail의 5번 행을 수정한 뒤 game_master의 5번 행을 수정하려고 한다.
이 경우:
- 트랜잭션 A는 game_master의 5번 행에 배타 Lock을 설정.
- 트랜잭션 B는 game_detail의 5번 행에 배타 Lock을 설정.
- 트랜잭션 A는 game_detail의 5번 행 Lock을 시도, 트랜잭션 B는 game_master의 5번 행 Lock을 시도.
- 이미 각 행은 상대 트랜잭션에 의해 Lock이 설정되어 있으므로, 양쪽 모두 대기하며 영원히 풀리지 않는다.
📌 교착상태 해결방법
- DBMS는 교착상태를 감지하면 한 트랜잭션에 에러를 발생시켜 문제를 해결한다.
- 교착상태를 줄이기 위해서는 테이블 접근 순서를 일정하게 유지하는 것이 중요하다.
- 예를 들어, 항상 game_master를 먼저 업데이트한 후 game_detail을 업데이트하도록 규칙을 정한다.
'SQL' 카테고리의 다른 글
[QueryDSL] QueryDSL 쓸려면 제대로 알고 쓰자 (1) | 2025.05.08 |
---|---|
[DB] 트랜잭션 (3) | 2025.05.01 |
[DB] H2 란? (2) | 2025.04.30 |
[SQL]UPPER/LOWER 대소문자 구분없이 Like 사용 (1) | 2025.03.05 |
[SQL]CSV 파일을 이용해 데이터 가져오기(MY SQL) (0) | 2025.01.20 |