MySQL Lock
MySQL에서의 잠금(Lock)은 데이터베이스에서 동시성을 관리하고 데이터 무결성을 모장하기 위해 사용되는 매커니즘임.
잠금은 여러 사용자가 동시에 같은 데이터에 액세스할 때 발생할 수 있는 충돌을 방지하고, 데이터를 안정적으로 읽고 쓸 수 있도록 도와줌.
MySQL에서는 주로 두 가지 유형의 잠금이 사용됨.
테이블 잠금과 행 잠금임.
1. 테이블 잠금 : Table Locks
테이블 잠금은 데이터베이스 테이블 전체에 걸쳐 잠금을 적용함.
이 잠금 방식은 간단하고 오버헤드가 적지만, 동시성 수준이 낮다는 단점이 있음.
MySQL의 MyISAM 스토리지 엔진에서 주로 사용됨.
1.1 읽기 잠금
다른 사용자들이 데이터를 읽는 것은 허용하지만, 쓰기는 차단함.
1.2 쓰기 잠금
다른 사용자들이 해당 테이블을 읽거나 쓰는 것을 전부 차단함.
2. 행 잠금 : Row Locks
행 잠금은 더 세밀한 잠금으로, 개별 데이터 행에 대해 잠금을 적용함.
이 방식은 동시성을 크게 향상시키지만, 관리해야 할 잠금의 수가 많아지므로 오버헤드가 증가할 수 있음.
InnoDB 스토리지 엔진에서 주로 사용됨.
2.1 공유 잠금
다른 트랜잭션이 해당 행을 읽을 수 있도록 허용하지만, 쓰기는 차단함.
2.2 배타 잠금
해당 행을 읽고 쓸 수 있는 권한을 잠금을 건 트랜잭션에게만 허용함.
잠금과 데드락
잠금 시스템은 데드락이라는 문제를 일으킬 수 있음.
데드락은 두 개 이상의 트랜잭션이 서로의 잠금 해제를 기다리는 상황에서 발생함.
MySQL은 이러한 상황을 감지하고 자동으로 하나 이상의 트랜잭션을 롤백하여 데드락을 해결함.
잠금 방식의 선택
MyISAM
동시성 요구가 낮은 읽기 전용 또는 배치 처리 유형의 작업에 적합함.
InnoDB
높은 동시성과 복잡한 드랜잭션이 필요한 애플리케이션에 적합함.
MySQL Lock 정리
잠금은 데이터베이스 성능과 직접적으로 관련됨.
적절한 잠금 전략을 선택하는 것이 중요함.
이를 통해 동시성을 최적화하고 시스템의 전반적인 성능과 무결성을 향상시킬 수 있음.
MySQL 데드락
MySQL에서 데드락은 여러 트랜잭션이 서로의 자원을 동시에 요구하면서, 상호 배제적으로 잠금을 필요로 할 때 발생함.
각 트랜잭션이 이미 가지고 있는 자원을 기반으로 다른 트랜잭션의 자원을 추가로 요구하며, 이로 인해 상호 봉쇄 상태가 발생하여 아무런 진행도 이루어질 수 없는 상태를 말함.
이는 모든 관계형 데이터베이스 관리 시스템에서 발생할 수 있는 일반적인 문제임.
MySQL 데드락 원인
1. 잘못된 잠금 순서
트랜잭션들이 서로 다른 순서로 잠금을 획득하려고 할 때, 예를 들어 트랜잭션 A가 먼저 R1을 잠그고 R2를 요구하는 동안, 트랜잭션 B는 R2를 잠그고 R1을 요구할 때 발생할 수 있음.
2. 인덱스 스캐닝
테이블을 인덱스 순서가 아닌 다른 순서로 접근할 때 발생할 수 있음.
3. 외래 키 관계
외래 키 제약 조건을 갖는 테이블 간의 관계에서 데드락이 자주 발생할 수 있음.
MySQL 데드락 감지 및 해결
MySQL에서는 InnoDB 스토리지 엔진이 내부적으로 데드락을 감지하고 해결하는 메커니즘을 가지고 있음.
데드락 감지 알고리즘은 다음과 같은 단계를 거침.
1. 감지
InnoDB는 주기적으로 또는 특정 임계점에 도달했을 때 잠금 대기 그래프를 검토하여 데드락을 감지함.
2. 해결
감지된 데드락을 해결하기 위해, InnoDB는 하나 이상의 트랜잭션을 롤백함.
롤백 대상 트랜잭션은 일반적으로 가장 적은 양의 작업을 수행한 트랜잭션임.
MySQL 데드락 방지 전략
1. 잠금 순서 일관성
모든 트랜잭션이 동일한 순서로 데이터에 접근하도록 구현함.
2. 분리 잠금
가능한 경우, 큰 트랜잭션을 여러 작은 트랜잭션으로 분리하여 잠금 시간을 최소화함.
3. 타임아웃 사용
잠금 대기 시간에 타임아웃을 설정하여, 특정 시간 동안 잠금을 획득하지 못할 경우 트랜잭션을 자동으로 롤백하도록 할 수 있음.
4. 인덱스와 키 사용 최적화
적절한 인덱스 사용으로 필요 없는 테이블 전체 잠금을 방지하고, 외래 키와 같은 데이터베이스 설계를 최적화하여 데드락의 가능성을 줄일 수 있음.
MySQL 데드락 정리
위와 같은 전략들은 MySQL 데이터베이스의 효율성을 높이고, 데드락으로 인한 시스템 중단을 방지하는 데 큰 도움이 됨.
데드락은 완전히 피할 수 없는 현상일 수 있음.
올바른 설계와 전략을 통해 그 발생 빈도와 영향을 최소화할 수 있음.
'Database > SQL' 카테고리의 다른 글
[MySQL] 인덱스 유형 종류 (1) | 2024.06.06 |
---|---|
[MySQL] 스토리지 엔진 종류, B-Tree 인덱스 (0) | 2024.06.06 |
[MySQL] 데이터 타입 (0) | 2024.06.04 |
[SQL] OLTP와 OLAP (1) | 2024.06.02 |
[SQL] 행 기반 데이터베이스와 열 기반 데이터베이스 (1) | 2024.06.02 |