트랜잭션 ACID중 격리성(Isolation)이 보장되지 않을때 문제

2026. 4. 1. 09:50·코드잇 스프린트/Spring 이론

트랜잭션 ACID 란?

트랜잭션이 안전하게 수행되기 위해 보장해야 하는 네가지 속성.

 

  • Atomicity(원자성): 트랜잭션 내의 모든 작업은 전부 성공하거나 전부 실패해야된다.
  • Consistency(일관성): 트랜잭션 실행 전후로 데이터베이스는 항상 일관된 상태를 유지해야한다.
  • Isolation(격리성): 동시에 실행되는 트랜잭션들은 서로 영향을 주지 않아야한다.
  • Durability(지속성): 커밋된 트랜잭션의 결과는 시스템 장애가 발생해도 영구적으로 보존되어야한다.

격리성이 보장되지 않을때 발생하는 문제?

Dirty Read(오염된 읽기)

  • 아직 커밋되지 않은 다른 트랜잭션의 변경 데이터를 읽는 현상.
  • 트랜잭션 B가 롤백되면, 트랜잭션 A가 읽은 데이터는 존재하지 않는 값이 된다.

Non-Repeatable Read(반복 불가능한 읽기)

  • 같은 트랜잭션 내에서 동일한 행을 두번 읽었는데 결과가 다른 현상.
  • 중간에 다른 트랜잭션이 해당 행을 수정후 커밋했기 때문이다 ..

Phantom Read(유령 읽기)

  • 같은 트랜잭션 내에서 동일 조건으로 두번 조회했는데 결과 행의 개수가 달라지는 현상.
  • 다른 트랜잭션이 INSERT 또는 DELETE를 커밋하면서 발생.

트랜잭션 격리 수준

READ UNCOMMITTED

  • 가장 낮은 격리 수준.
  • 다른 트랜잭션이 아직 커밋하지 않은 변경사항까지 읽을 수 있다.
  • 세가지 이상 현상이 모두 발생하며, 실제 운영 환경에서는 거의 사용 x

READ COMMITTED

  • Oracle, PostgreSQL, SQL Server의 기본값.
  • 커밋된 데이터만 읽으므로 Dirty Read는 방지.
  • 같은 트랜잭션 내에서 동일 쿼리를 반복하면 다른 결과가 나올 수 있다.(Non-Repeatable Read 발생)

REPEATABLE READ

  • MySQL InnoDB의 기본값.
  • 트랜잭션 시작 시점의 스냅샷을 읽으므로, 조회했던 행의 값은 변하지 않음을 보장한다.
  • Phantom Read는 표준상 발생할 수 있으나, MySQL InnoDB는 Gap Lock으로 이를 추가로 방지한다.

SERIALIZABLE

  • 가장 높은 격리 수준.
  • 트랜잭션들이 마치 순차적으로 하나씩 실행된 것처럼 동작을 보장.
  • 범위 잠금(Range Lock)을 사용하므로 모든 이상현상을 방지.
  • *동시성이 크게 저하되어 성능 비용이 높다.

*동시성

여러 작업을 얼마나 동시에 처리할 수 있는가.

데이터베이스에서 여러 사용자가 동시에 트랜잭션을 실행할때, 이 트랜잭션들이 서로 기다리지 않고 병렬로 처리되는 정도를 의미.

 

왜 SERIALIZABLE에서 동시성이 떨어지나?

- SERIALIZABLE은 "트랜잭션을 순서대로 하나씩 실행한것처럼 보장" 해야하기 때문에, 충돌 가능성이 있는 데이터에 락(Lock)을 걸어둔다.

락이 걸린 데이터에 접근하려는 다른 트랜잭션은 줄을 서서 기다려야한다.

 

ex) 쇼핑몰에서 동시에 1,000명이 주문을 넣는다면, SERIALIZABLE에서는 한 트랜잭션이 끝날때까지 나머지가 대기하게 된다.

READ COMMITTED라면 대부분 기다리지 않고 바로 처리된다.

 

화장실 1칸, 한명씩만 사용가능 - SERIALIZABLE - 동시성 낮음

화장실 10칸, 동시에 10명 사용가능 - READ COMMITTED - 동시성 높음 ..

락을 많이 걸수록 화장실 칸수가 줄어드는 셈 ..

 

 

 

[실무 선택 기준]

  • 일반적인 웹서비스는 READ COMMITTED 또는 REPEATABLE READ 사용.
  • 금융 거리 처럼 완전한 일관성이 필요한 경우 SERIALIZABLE을 선택적으로 적용하되, 성능 영향을 충분히 고려해야한다.
  • 격리 수준을 높일수록 락 경합과 데드락 가능성이 증가하므로, 비즈니스 요구사항과 성능 사이의 균형이 핵심.

READ COMMITED의 예시

 

'코드잇 스프린트 > Spring 이론' 카테고리의 다른 글

Spring Security에서 왜 Member 대신 UserDetails를 사용하나?  (0) 2026.05.12
애플리케이션의 각 계층에서 수행되는 입력값 검증의 범위와 책임  (0) 2026.04.06
JPA에서 발생하는 N+1 문제의 발생 원인과 해결 방안(EAGER 는 JOIN이 아니다.)  (1) 2026.03.26
웹 API가 SOAP에서 REST로 전환된 이유  (0) 2026.02.27
Spring Bean이란?  (2) 2026.01.26
'코드잇 스프린트/Spring 이론' 카테고리의 다른 글
  • Spring Security에서 왜 Member 대신 UserDetails를 사용하나?
  • 애플리케이션의 각 계층에서 수행되는 입력값 검증의 범위와 책임
  • JPA에서 발생하는 N+1 문제의 발생 원인과 해결 방안(EAGER 는 JOIN이 아니다.)
  • 웹 API가 SOAP에서 REST로 전환된 이유
과컴
과컴
벡엔드 개발자 최소기준 맞추겠습니다.
  • 과컴
    곽의 프로그램
    과컴
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • 위클리페이퍼 (6)
      • 파이썬 (4)
      • 코드잇 스프린트 (48)
        • Spring 이론 (7)
        • Java이론 (11)
        • 실습 (23)
      • 백엔드 개발자 최소기준 (1)
      • 코딩테스트 (5)
        • 알고리즘 (0)
        • SQL (1)
      • Git (5)
      • 스프링부트 핵심가이드 (1)
      • 트러블 슈팅 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준브론즈
    혼공파
    파이썬기초
    백준1152
    파이썬입문
    백준2576
    백준1075번
    문자열
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
과컴
트랜잭션 ACID중 격리성(Isolation)이 보장되지 않을때 문제
상단으로

티스토리툴바