?
사용자
데이터베이스 트랜잭션 격리 수준과 잠금 메커니즘 이해 가이드
데이터베이스 동시성 제어의 핵심인 트랜잭션 격리 수준과 잠금 메커니즘을 체계적으로 이해하고 실무에 적용하고자 할 때 유용합니다.
#트랜잭션#격리 수준#잠금#동시성#데이터베이스
recipe.md
데이터베이스 트랜잭션 격리 수준 및 잠금 메커니즘 학습 가이드
1. 목표
데이터베이스 트랜잭션의 ACID 특성 중 일관성(Consistency)을 보장하기 위한 트랜잭션 격리 수준(Isolation Level)과 이를 구현하는 잠금(Lock) 메커니즘을 깊이 이해한다.
2. 학습 내용
2.1. 트랜잭션 격리 수준 (Isolation Level)
- 정의: 여러 트랜잭션이 동시에 실행될 때, 서로에게 미치는 영향을 어느 정도 차단할지를 결정하는 설정.
- 격리 수준의 종류 (낮은 수준부터 높은 수준까지):
- READ UNCOMMITTED (읽기 불허):
- 가장 낮은 수준. 다른 트랜잭션이 아직 커밋하지 않은 데이터(Dirty Read)를 읽을 수 있음.
- 성능은 가장 좋지만, 데이터 일관성이 가장 낮음.
- READ COMMITTED (읽기 허용):
- 다른 트랜잭션이 커밋한 데이터만 읽을 수 있음.
- Dirty Read는 방지되지만, Non-repeatable Read (반복 읽기 시 데이터 변경) 와 Phantom Read (범위 조회 시 레코드 추가/삭제)는 발생 가능.
- MySQL (InnoDB 기본값 아님), PostgreSQL, Oracle 등에서 기본값으로 많이 사용.
- REPEATABLE READ (반복 읽기 허용):
- 하나의 트랜잭션 내에서 동일한 데이터를 여러 번 읽어도 항상 같은 값을 보장 (Non-repeatable Read 방지).
- Phantom Read는 발생 가능.
- MySQL (InnoDB 기본값).
- SERIALIZABLE (직렬화 가능):
- 가장 높은 수준. 트랜잭션이 순차적으로 실행되는 것과 동일한 결과 보장.
- 모든 동시성 이슈 (Dirty Read, Non-repeatable Read, Phantom Read) 방지.
- 성능 저하가 가장 크므로, 꼭 필요한 경우에만 사용.
- READ UNCOMMITTED (읽기 불허):
2.2. 동시성 이슈 (Concurrency Issues)
- Dirty Read (더티 읽기): 커밋되지 않은 데이터를 읽는 현상. 롤백되면 유효하지 않은 데이터.
- Non-repeatable Read (반복 불가능 읽기): 한 트랜잭션 내에서 같은 행을 두 번 이상 읽을 때, 다른 트랜잭션에 의해 값이 변경되어 다른 결과를 얻는 현상.
- Phantom Read (팬텀 읽기): 한 트랜잭션 내에서 같은 조건으로 두 번 이상 범위를 조회할 때, 다른 트랜잭션에 의해 새로운 행이 삽입되거나 삭제되어 다른 결과를 얻는 현상.
2.3. 잠금 (Lock) 메커니즘
- 목적: 동시성 이슈를 방지하고 데이터 무결성을 유지하기 위해, 특정 데이터에 대한 동시 접근을 제어.
- 잠금의 종류:
- 공유 잠금 (Shared Lock, S Lock): 데이터를 읽을 때 사용. 여러 트랜잭션이 동시에 동일한 데이터에 대해 공유 잠금을 획득할 수 있음. 데이터를 수정하는 배타 잠금(X Lock)은 획득 불가.
- 배타 잠금 (Exclusive Lock, X Lock): 데이터를 수정(INSERT, UPDATE, DELETE)할 때 사용. 오직 하나의 트랜잭션만 획득 가능. 다른 트랜잭션은 공유 잠금이나 배타 잠금 모두 획득 불가.
- 의도 잠금 (Intent Lock, IS/IX Lock): 테이블 레벨에서 레코드 잠금의 사용 의도를 미리 알리기 위한 잠금. 다른 트랜잭션이 테이블 전체를 잠그는 것을 방지.
- 잠금의 범위: Row-level Lock, Page-level Lock, Table-level Lock.
- 데드락 (Deadlock): 두 개 이상의 트랜잭션이 서로 상대방이 가진 리소스를 기다리며 무한정 대기하는 상태. 데이터베이스 시스템은 데드락 감지 및 해결 메커니즘을 갖추고 있음 (예: 타임아웃, 데드락 희생자 선택).
3. 적용 및 실습
- MySQL (InnoDB 엔진) 기본 설정 확인:
SHOW VARIABLES LIKE 'transaction_isolation';명령어로 현재 격리 수준 확인. - 격리 수준 변경:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;(예시) - 잠금 동작 테스트:
- 트랜잭션 A에서 특정 레코드에 UPDATE 문 실행 (자동으로 X Lock 획득).
- 트랜잭션 B에서 동일 레코드에 SELECT 문 실행 (READ COMMITTED 이하에서는 가능, REPEATABLE READ 이상에서는 대기 또는 에러).
- 트랜잭션 A에서 트랜잭션 커밋 또는 롤백.
- 성능 비교: 다른 격리 수준에서 동일한 부하 테스트를 수행하여 응답 시간 및 처리량 비교.
4. 참고 자료
- 사용 중인 데이터베이스 시스템 (MySQL, PostgreSQL, Oracle 등)의 공식 문서에서 트랜잭션 및 잠금 관련 상세 내용 참조.
- 데이터베이스 동시성 제어 및 복구 기법 관련 서적.
5. 주의사항
- 격리 수준을 높일수록 동시성 문제는 줄지만, 성능 저하가 발생할 수 있으므로 애플리케이션의 요구사항과 부하를 고려하여 최적의 수준을 선택해야 합니다.
- 잠금 메커니즘은 복잡하며, 데이터베이스 종류에 따라 구현 방식에 차이가 있을 수 있습니다.
- 데드락은 애플리케이션의 심각한 장애를 유발하므로, 트랜잭션 설계 시 데드락 발생 가능성을 최소화하는 것이 중요합니다.
13
스크랩
7
좋아요
0
댓글