| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 엘라스틱서치
- 백엔드
- It
- kibana
- 일감관리
- 데이터베이스
- redmine
- db
- 프로젝트관리
- 스프링
- 검색
- Database
- 인덱스
- spring
- 웹프론트
- PM
- 개발자
- 자바
- 비전공개발자
- backend
- AOP
- java
- Si
- elasticsearch
- spring aop
- frontend
- 레드마인
- 오라클
- 이슈관리
- PreparedStatement
- Today
- Total
리타의 저장소
Lock 과 트랜잭션 동시성 제어 #1 본문
트랜잭션의 특징
- 원자성 - 분해 불가능한 업무 최소 단위
- 일관성
- 격리성
- 영속성
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을 많이 사용하면, 동시성이 떨어지게 된다.
'Dev > Backend' 카테고리의 다른 글
| Lock과 트랜잭션 동시성제어 #3 (0) | 2026.04.03 |
|---|---|
| Lock 과 트랜잭션 동시성 제어 #2 (0) | 2026.04.03 |
| Presigned Url, Signed Url, Signed Cookie (1) | 2026.03.02 |
| GC의 종류 & 운영중인 시스템의 GC 확인하기 (0) | 2025.10.11 |
| Spring AOP | @Transactional과 self-invocation 문제 (0) | 2025.10.11 |
