Aurora MySQL 격리 수준 이해하기
MySQL을 사용할 때 격리 수준(Isolation Level) 을 제대로 설정하는 것은 성능과 데이터 일관성 사이에서 균형을 유지하는 데 중요합니다. Amazon Aurora MySQL에서도 이러한 격리 수준을 상황에 따라 적절히 선택할 수 있습니다. 이번 포스팅에서는 Aurora MySQL의 격리 수준이 어떻게 작동하는지 이해하고, 언제 어떤 격리 수준을 선택해야 하는지 살펴보겠습니다.
사용 가능한 격리 수준
Aurora MySQL은 총 4가지 격리 수준을 지원합니다.
REPEATABLE READ(기본)READ COMMITTEDREAD UNCOMMITTEDSERIALIZABLE
기본적으로는 REPEATABLE READ를 사용하며, 필요에 따라 다른 격리 수준으로 변경할 수 있습니다.
Writer와 Reader의 기본 동작
Writer 인스턴스
Writer 인스턴스(기본 인스턴스)는 네 가지 격리 수준을 모두 사용할 수 있으며, SQL 명령어를 통해 자유롭게 변경할 수 있습니다.
Reader 인스턴스
Reader 인스턴스(Aurora 복제본)는 기본적으로 항상 REPEATABLE READ 격리 수준을 사용하며, 격리 수준 변경 명령을 무시합니다.
Aurora 복제본(Reader)에서 READ COMMITTED 활성화하기
Writer 인스턴스에서 쓰기 작업이 많고 리더 인스턴스에서 장기 실행 쿼리가 자주 발생하면 내부적으로 Garbage Collection이 지연되어 성능 저하와 스토리지 낭비가 발생할 수 있습니다. 이때는 Aurora 복제본에서 READ COMMITTED 격리 수준을 사용해 문제를 완화할 수 있습니다.
READ COMMITTED 활성화 방법
Aurora 복제본에서 세션 단위로 다음과 같이 설정할 수 있습니다.
SET SESSION aurora_read_replica_read_committed = ON;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
세션별로 설정하면 전체 애플리케이션의 기본 동작을 변경하지 않고 특정 쿼리에만 적용할 수 있어 유용합니다.
READ COMMITTED 격리 수준 사용 시 주의사항
Aurora 복제본의 READ COMMITTED는 ANSI SQL 표준을 따르며, MySQL 표준보다 다소 덜 엄격하게 동작합니다. 따라서 다음과 같은 읽기 이상(Anomalies)이 발생할 수 있음을 유의해야 합니다.
- Non-repeatable Read: 쿼리 실행 도중 다른 트랜잭션의 데이터가 커밋되어 결과가 달라질 수 있습니다.
- Phantom Read: 쿼리 실행 중 다른 트랜잭션에 의해 데이터가 추가 또는 제거되면서 일관성 없는 결과가 나타날 수 있습니다.
따라서 다음과 같은 상황에서 사용하는 것이 권장됩니다.
- 대량 데이터 분석 및 보고서 쿼리 등 장기 실행 쿼리가 많고 절대적인 정밀도가 필수가 아닌 경우
반면, 금융 시스템과 같이 일관성과 정밀성이 중요한 애플리케이션에서는 사용하지 않는 것이 좋습니다.
예시로 보는 READ COMMITTED 동작의 차이
다음 표는 기본 인스턴스와 Aurora 복제본 간 격리 수준의 동작 차이를 이해하기 쉽게 보여줍니다.
| 시간 | Aurora Writer (REPEATABLE READ) | Aurora Replica (READ COMMITTED) |
|---|---|---|
| T1 | INSERT 1,000,000행; COMMIT | — |
| T2 | SELECT COUNT(*) → 1,000,000 | SELECT COUNT(*) → 1,000,000 |
| T3 | INSERT 1행; COMMIT | — |
| T4 | SELECT COUNT(*) → 1,000,000 | SELECT COUNT(*) → 1,000,000 또는 1,000,001 |
| T5 | DELETE 2행; COMMIT | — |
| T6 | SELECT COUNT(*) → 1,000,000 | SELECT COUNT(*) → 1,000,000, 1,000,001, 999,999 또는 999,998 |
라이터 인스턴스는 트랜잭션 시작 시점 기준으로 일관된 결과를 유지하는 반면, Aurora 복제본은 중간에 발생한 데이터 변경을 즉시 반영하여 결과가 유동적일 수 있습니다.
Aurora MySQL의 격리 수준을 이해하면 데이터 일관성과 성능 사이에서 균형을 맞출 수 있습니다. 장기 실행 쿼리와 쓰기 작업이 동시에 발생하는 환경이라면 Aurora 복제본의 READ COMMITTED 설정을 적극 활용할 수 있지만, 정확성과 일관성이 중요한 환경에서는 기본 설정인 REPEATABLE READ를 유지하는 것이 좋습니다.