리타의 저장소

Lock 과 트랜잭션 동시성 제어 #1 본문

Dev/Backend

Lock 과 트랜잭션 동시성 제어 #1

ريتا 2026. 4. 3. 21:00

트랜잭션의 특징

  • 원자성 - 분해 불가능한 업무 최소 단위
  • 일관성
  • 격리성
  • 영속성

Dirty Read

다른 트랜잭션에 의해 수정되었으나, 아직 커밋되지 않은 데이터를 읽는 것.
변경 후 아직 커밋되지 않은 값을 읽었는데, 만약 변경을 가한 트랜잭션이 최종적으로 롤백된다면 그 값을 읽은 트랜잭션은 비일관된 상태에 놓이게 된다.

Non-Repeatable Read

한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이 다른 트랜잭션이 값을 수정/삭제 하는 바람에 두 쿼리 결과가 다르게 나타나는 현상을 말함

Phantom Read

한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유형(phantom) 레코드가 두 번째 쿼리에서 나타나는 현상.

트랜잭션 수준 읽기 일관성 ?

문장수준 읽기 일관성(Statement-Level Read Consistency)은,
쿼리가 시작된 시점을 기준으로 데이터를 일관성 있게 읽어들이는 것.

트랜잭션 수준 읽기 일관성(Transaction-Lewi Read Consistency)은,
트랜잭션이 시작된 시점을 기준으로 일관성 있게 데이터를 읽어들이는 것.

 

 

ANSI/ISO SQL standard(SQL92)

 

레벨 0 : Read Uncommited

→ 트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
→ Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생
→ Oracle은 이 레벨을 지원하진 않는다.

 

레벨 1 : Read Commited

→ 트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함으로써 Dirty Read 방지. (읽는 시점에 따라 결과가 다를 수 있음)
→ 대부분의 DBMS가 기본모드로 채택하고 있는 일관성 모드
→ Non-Repeatable Read, Phantom Read 현상 발생
→ Oracle에서는 Lock을 사용하지 않고 쿼리 시작 시점의 Undo 데이터를 제공하는 방식으로 구현

 

레벨 2 : Repeatable Read

트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해줌.
→ (Phantom Read 현상을 막지는 못함)
→ 첫 번 째 쿼리에서는 없던 새로운 레코드가 나타날 수 있음.
→ Oracle은 이 레벨을 명시적으로 지원하진 않으나 for update 같은 구문을 이용하여 구현 가능

 

레벨 3 : Serializable Read

트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않음.
→ 완벽한 읽기 일관성 모드 제공

 

동시성과 일관성의 상관관계

  • 동시성(Concurrency) : 다중 사용자가 같은 데이터를 동시에 액세스
  • 일관성(Consistency) : 자신이 발생시 킨 변경 사항과 다른 트랜잭션의 변경 사항(읽을 수 있
    는 버전만 허용)을 포함해 일관성 있는 상태로 데이터를 제공

→ 동시성 제어가 어려운 이유는, 동시성과 일관성이 트레이드 오프 관계에 있기 때문이다. 동시성을 높이려고 Lock 사용을 최소화하면 읽기 일관성을 유지하기 어렵고, 데이터의 일관성을 높이려고 Lock을 많이 사용하면, 동시성이 떨어지게 된다.