백엔드 공부진행도/SpringBoot
트랜잭션 격리수준
myeongjaechoi
2024. 12. 18. 06:09
트랜잭션 격리 수준이란?
- 동시에 여러 트랜잭션이 실행될 때 한 트랙잭션이 다른 트랜잭션의 연산에 영향을 받지 않도록 하는 정도
- 낮은 격리 수준은 동시 처리 능력을 높이지만, 데이터의 일관성 문제를 발생시킬 수 있음
- 높은 격리 수준은 데이터 일관성을 보장하지만, 동시 처리 능력이 떨어질 수 있음
- 데이터 정합성과 성능은 반비례
트랜잭션 격리 수준 종류와 특징
- READ UNCOMMITTED
- 커밋이 되지 않은 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 조회하는 것을 허용
- Dirty Read, Phantom Read, Non-Repeatable Read 문제 발생할 수 있음
- READ COMMITTED
- 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
- 특정 트랜잭션이 이루어지는 동안, 다른 트랜잭션은 해당 데이터에 접근X
- Dirty Read X, Phantom Read, Non-Repeatable Read 문제 발생할 수 있음
- REPEATABLE READ
- 한 트랜잭션에서 특정 레코드를 조회할 때 항상 같은 데이터를 응답하는 것을 보장
- Non-Repeatable Read X, Phantom Read문제 발생할 수 있음
Dirty Read
- 정의 : 한 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽는 현상
- 문제점 : 커밋되지 않은 데이터는 롤백될 가능성이 있으므로, 잘못된 데이터를 기반으로 작업 가능성
- 예시:
- 트랜잭션 A가 데이터 값을 수정했지만 커밋하지 않은 상태
- 트랜잭션 B가 이 데이터를 읽음
- 이후 트랜잭션 A가 롤백하면, 트랜잭션 B는 잘못된 데이터를 사용
Non-Repeatable Read(반복 불가능 읽기)
- 정의 : 한 트랜잭션 내에서 같은 데이터를 두 번 읽었을 때, 다른 트랜잭션이 데이터를 변경하거나 삭제하여 결과가 달라지는 현상
- 문제점 : 동일한 데이터를 반복해서 읽었을 때 일관성을 보장하지 못함
- 예시:
- 트랜잭션 A가 특정 데이터를 읽음(값:100)
- 트랜잭션 B가 해당 데이터를 수정(값:200)하고 커밋
- 트랜잭션 A가 다시 데이터를 읽었을 때 값이 변경됨(값:200)
Phantom Read
- 정의 : 한 트랜잭션 내에서 동일한 조건으로 두 번 조회했을 때, 다른 트랜잭션이 데이터를 추가하거나 삭제하여 결과 집합이 달라지는 현상
- 문제점 : 데이터의 집합의 크기나 내용이 일관되지 않음
- 예시:
- 트랜잭션 A가 특정 조건(AGE>30)으로 데이터를 조회(결과: 3명)
- 트랜잭션 B가 해당 조건에 맞는 새로운 데이터를 추가하고 커밋(새로운 데이터 추가)
- 트랜잭션 A가 다시 같은 조건으로 조회했을 때 결과가 달라짐(결과: 4명)
격리 수준별 문제 발생 여부
Isolation Level | Dirty Read | Non-Repeatable Read | Phantom Read |
Read Uncommitted | 발생 | 발생 | 발생 |
Read Committed | 방지 | 발생 | 발생 |
Repeatable Read | 방지 | 방지 | 발생 |
Serializable | 방지 | 방지 | 방지 |