트랜잭션 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 |