트랜잭션은 데이터베이스의 데이터를 다루는 논리적인 작업의 단위이며, 다음과 같은 ACID 속성을 보장해야 합니다:
원자성 (Atomicity)
일관성 (Consistency)
격리성 (Isolation)
지속성 (Durability)
여러 트랜잭션이 동시에 수행될 때 발생할 수 있는 문제들:
Dirty Read
Non-Repeatable Read
Phantom Read
가장 낮은 격리수준으로, 다른 트랜잭션의 변경사항이 COMMIT이나 ROLLBACK 여부와 관계없이 보여집니다.
초기상태: 계좌잔액 1000원
[Transaction 1] [Transaction 2]
계좌잔액 갱신 (-500원)
잔액 = 500원
잔액 조회
-> 500원 확인 (Dirty Read 발생)
ROLLBACK
잔액 = 1000원
잔액 사용 시도 실패
커밋된 데이터만 읽을 수 있는 격리수준입니다. Oracle의 기본 격리수준입니다.
초기상태: 상품 A의 재고 100개
[Transaction 1] [Transaction 2]
재고 조회
-> 100개 확인
재고 수정 (-30개)
재고 = 70개
COMMIT
재고 다시 조회
-> 70개 확인 (Non-Repeatable Read 발생)
MySQL InnoDB의 기본 격리수준으로, 트랜잭션이 시작된 시점의 데이터를 일관되게 보장합니다.
초기상태: 회원 테이블에 10명의 회원 존재
[Transaction 1] [Transaction 2]
전체 회원 조회
-> 10명 확인
새 회원 추가
COMMIT
전체 회원 수 조회
-> 10명 유지 (이전 스냅샷 유지)
특정 조건으로 회원 조회
-> 11명 확인 (Phantom Read 발생 가능)
가장 높은 격리수준으로, 완벽한 데이터 정합성을 보장합니다.
초기상태: 상품 B의 재고 1개
[Transaction 1] [Transaction 2]
상품 B 재고 확인
-> 1개 확인
상품 B 재고 확인
-> 대기 (잠금)
주문 처리
재고 차감
COMMIT
-> 0개 확인 (일관성 보장)
Q: 트랜잭션 격리수준이란 무엇이며, 각 격리수준의 차이를 설명해주세요.
A: 트랜잭션 격리수준은 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치는 정도를 제어하는 기준입니다. READ UNCOMMITTED는 커밋되지 않은 데이터도 읽을 수 있어 데이터 정합성이 매우 낮고, READ COMMITTED는 커밋된 데이터만 읽을 수 있어 더티 리드는 방지됩니다. REPEATABLE READ는 트랜잭션 시작 시점의 데이터 일관성을 보장하며, SERIALIZABLE은 완벽한 격리를 제공하지만 성능이 가장 낮습니다. 각 수준은 높아질수록 더 강력한 데이터 일관성을 제공하는 대신 동시성 처리 성능이 저하됩니다.
Q: Dirty Read, Non-Repeatable Read, Phantom Read의 차이점을 설명해주세요.
A: 이 세 가지는 트랜잭션 격리수준에 따라 발생할 수 있는 데이터 불일치 현상입니다. Dirty Read는 아직 커밋되지 않은 변경사항을 다른 트랜잭션에서 읽을 수 있는 현상입니다. Non-Repeatable Read는 한 트랜잭션 내에서 같은 데이터를 두 번 읽었을 때 결과가 다른 현상으로, 다른 트랜잭션의 커밋된 수정으로 인해 발생합니다. Phantom Read는 한 트랜잭션에서 같은 쿼리를 두 번 실행했을 때 결과 집합이 달라지는 현상으로, 다른 트랜잭션의 삽입이나 삭제로 인해 발생합니다.
Q: 실무에서는 주로 어떤 격리수준을 사용하나요? 그 이유는 무엇인가요?
A: 실무에서는 주로 READ COMMITTED나 REPEATABLE READ 격리수준을 사용합니다. READ UNCOMMITTED는 데이터 정합성을 보장할 수 없어 위험하고, SERIALIZABLE은 동시성 처리 성능이 매우 낮아 실무에 적합하지 않습니다. Oracle은 기본적으로 READ COMMITTED를, MySQL(InnoDB)은 REPEATABLE READ를 사용하며, 이는 데이터 정합성과 성능 사이의 적절한 균형을 제공합니다. 특히 READ COMMITTED는 커밋된 데이터만 읽을 수 있어 기본적인 데이터 정합성을 보장하면서도 적절한 동시성 처리 성능을 제공하기 때문에 많이 사용됩니다.