읽기 이상 현상
Dirty Read (더티 리드)
커멋 되지 않은 다른 트랜잭션의 데이터를 읽는 경우, 만약 첫 번째 트랜잭션이 롤백되면, 두 번째 트랜잭션이 읽은 데이터는 무효.
Non-Repeatable Read (반복 불가능 읽기)
동일한 트랜잭션 내에서 동일한 쿼리를 두 번 이상 실행할 때, 두 번째 실행 시 이전과 다른 결과를 얻는 경우. 이는 다른 트랜잭션이 데이터를 수정했기 때문.
Phantom Read (팬텀 리드)
동일한 트랜잭션 내에서 동일한 쿼리를 반복할 때, 처음에는 없던 새로운 행이 나타나는 경우. 이는 다른 트랜잭션이 해당 범위에 새로운 행을 삽입했기 때문.
Lost Update (손실된 업데이트)
두 개의 트랜잭션이 동일한 데이터를 읽고 수정하는 과정에서, 한 트랜잭션의 수정이 다른 트랜잭션의 수정에 의해 덮어씌워지는 경우.
이는 트랜잭션 간의 동시성 제어 부족으로 인해 발생.
Write Skew
두 트랜잭션이 서로의 상태를 기반으로 데이터를 수정할 때 발생하는 이상 현상. 서로의 상태를 보고 각각의 업데이트가 충돌 없이 진행되지만, 두 업데이트가 결합되면 데이터 무결성이 손상.
트랜잭션 격리 수준
READ UNCOMMITTED (커밋되지 않은 읽기)
READ COMMITTED (커밋된 읽기)
REPEATABLE READ (반복 가능 읽기)
SERIALIZABLE (직렬화 가능)
아래로 내려갈수록 격리수준이 높음
READ UNCOMMITTED (커밋되지 않은 읽기)
가장 낮은 수준의 격리 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다(Dirty Read). 이로 인해 데이터의 일관성이 보장되지 않으며, 일반적으로 사용되지 않는다.
READ COMMITTED (커밋된 읽기)
각 일관된 읽기 작업이 항상 최신 커밋된 데이터를 읽도록 보장. 이는 트랜잭션 내에서 여러 번의 SELECT 문이 서로 다른 결과를 반환할 수 있음을 의미.
- 잠금 동작:
- 갭 잠금이 비활성화되어, 트랜잭션 간의 충돌 가능성이 낮아지고 동시성이 향상됩니다.
- 인덱스 레코드만 잠그고 갭을 잠그지 않으므로, 팬텀 리드 문제가 발생할 수 있다.
- UPDATE 또는 DELETE 문에서, MySQL은 먼저 최신 커밋된 버전을 읽고 나서 해당 행이 WHERE 조건에 맞는지 확인한 후, 필요시 잠금을 설정하고 업데이트를 수행.
REPEATABLE READ (반복 가능 읽기)
InnoDB의 기본 트랜잭션 격리 수준. 트랜잭션 내에서 일관된 읽기(Consistent Read)를 보장하며, 동일한 트랜잭션 내에서 여러 번의 SELECT 문이 항상 동일한 결과를 반환.
- 잠금 동작:
- 고유 인덱스(Unique Index)를 사용하는 검색에서는 해당 인덱스 레코드만 잠김.
- 범위 검색에서는 갭 잠금(Gap Lock) 또는 넥스트 키 잠금(Next-Key Lock)을 사용하여 다른 트랜잭션이 해당 범위 내에 새로운 행을 삽입하지 못하게 한다. 이는 팬텀 리드(Phantom Read) 문제를 방지.
SERIALIZABLE (직렬화 가능)
가장 높은 수준의 격리 트랜잭션이 일련의 직렬화된 트랜잭션처럼 동작하도록 강제.
즉, 모든 SELECT 문이 SELECT ... FOR SHARE로 변환되며, 이로 인해 동시성이 크게 제한.
ACID 원칙이 매우 중요한 상황이나 동시성이 낮아도 되는 경우에 사용.
'Database > RDS' 카테고리의 다른 글
| InnoDB - Undo Log, Redo Log (0) | 2024.08.14 |
|---|---|
| InnoDB - GTID (0) | 2024.08.13 |
| InnoDB - Replication (0) | 2024.08.13 |
| InnoDB - Locking (0) | 2024.08.12 |
| MySQL 성능 최적화 - 고성능 시스템 구축을 위한 전략과 최적화 기법 - 07. 고성능을 위한 인덱싱 (0) | 2024.08.09 |