MySQL DB 격리 수준, 함정에 빠지다!

by DD
1년 전
조회수 6

MySQL로 DB 변경 후, Repeatable Read 격리 수준으로 인해 동시성 문제 발생

DB Lock 적용 후, `readUserMethod` 호출로 인해 데이터 불일치 발생

Read Committed로 격리 수준 변경 또는 DB Lock 내부에서 잔액 조회로 문제 해결

Repeatable Read의 함정

MySQL의 Repeatable Read는 트랜잭션 내에서 최초 읽은 데이터를 유지하여 데이터 일관성을 보장한다. 구체적으로, `readUserMethod` 호출 시점에 잔액을 읽어온 후, DB Lock 획득 후에도 기존 잔액을 사용하게 되어 결제 실패가 발생했다. 따라서, DB 격리 수준에 대한 깊이 있는 이해가 필요하다.

Oracle vs MySQL 격리 수준 비교

Oracle은 기본적으로 Read Committed 격리 수준을 사용하며, 커밋된 데이터만 읽어온다. 반면, MySQL은 Repeatable Read가 기본 설정이므로, 동일한 트랜잭션 내에서 데이터가 변경되어도 최초 읽은 값을 유지한다. 따라서, DB 종류에 따라 격리 수준 설정을 신중하게 결정해야 한다.

DB 격리 수준 선택 가이드

DB 격리 수준 선택은 데이터 일관성동시성 사이의 트레이드오프를 고려해야 한다. 구체적으로, Read Committed가용성을 높이지만, Dirty Read를 허용할 수 있다. 따라서, 비즈니스 요구사항에 따라 적절한 격리 수준을 선택하고, 프레임워크 설정을 확인하여 예상치 못한 문제를 방지해야 한다.

실무에서 만나는 DB isolation level