
안녕하세요 인터럽트입니다.
이번 포스팅에서는 DB의 트랜잭션 격리 수준에 대해서 정리해보려고 합니다.
개념은 알고 있지만 미리 정리를 함으로 써 면접 시 좀 더 깔끔한 답변을 할 수 있겠죠?
데이터베이스는 트랜잭션이라는 작업 단위로 묶어서 데이터를 처리합니다.
작업도중 문제가 발생하면 모든 작업을 원래 상태로 rollback 할 수 있어서 데이터의 일관성과 신뢰성을 유지할 수 있습니다.
이 과정에서 동시에 여러 트랜잭션이 수행될 때 발생할 수 있는 문제를 제어하기 위해 필요한 개념이 격리수준(Isolation Level)
입니다.
트랜잭션 격리 수준이란?
트랜잭션 격리 수준은 데이터베이스가 동시에 실행되는 여러 트랜잭션 간의 상호작용을 제어하는 방식입니다.
격리 수준에 따라 트랜잭션 간에 발생할 수 있는 읽기오류, 데이터 일관성 문제
를 방지하는 정도가 달라집니다.
트랜잭션 충돌로 발생할 수 있는 문제
Dirty Read(더티 읽기)
한 트랜잭션이 커밋되지 않은 데이터를 읽는 경우.

Non-Repeatable Read(반복 불가능 읽기)
한 트랜잭션에서 동일한 데이터를 두 번 읽을 때 값이 달라지는 경우

Phantom Read(팬텀 읽기)
한 트랜잭션에서 동일한 조건으로 조회했을 때 추가되거나 삭제된 행으로 결과가 달라지는 경우

트랜잭션 격리 수준의 종류
Read Uncommitted(읽기 미완료 허용)
가장 낮은 격리 수준으로 다른 트랜잭션이 커밋하지 않은 데이터도 읽을 수 있습니다.
특징
- Dirty Read 문제가 발생할 수 있다.
- 성능은 가장 좋지만 데이터 무결성에 취약하다.
사용이유
데이터 정확성보다 성능이 중요한 경우.
--예제
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRANSACTION;
SELECT * FROM Orders;
Read Committed(읽기 커밋 허용)
트랜잭션이 커밋된 데이터만 읽을 수 있습니다.

특징
- Dirty Read 방지
- Non-Repeatable Read 가능성 존재.
사용이유
대부분의 애플리케이션에서 기본적으로 사용하는 격리 수준입니다.
--예제
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
SELECT * FROM Orders WHERE Status = 'Pending';
Repeatable Read(반복 가능 읽기)
트랜잭션이 완료될 때까지 동일한 데이터를 읽을 때 일관성을 보장합니다.

특징
- Dirty Read와 Non-Repeatable 방지.
- Phantom Read 가능성 존재
사용이유
금융, 의료 시스템처럼 데이터 일관성이 중요한 경우.
--예제
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT * FROM Products WHERE Category = 'Books';
Serializable(직렬화)
가장 높은 격리 수준으로, 트랜잭션이 직렬화된 것처럼 순차적으로 실행됩니다.
특징
- Dirty Read, Non-Repeatable, Phantom Read 모두 방지.
- 성능은 가장 낮고, 잠금과 대기 시간이 길어질 수 있음.
사용이유
은행 이체, 재고 관리등 강력한 데이터 무결성이 필요한 경우.
--예제
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM Accounts WHERE Balance > 1000;
격리 수준 비교
격리수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 성능 |
Read Uncommitted | 가능 | 가능 | 가능 | 최고 |
Read Committed | 방지 | 가능 | 가능 | 높음 |
Repeatable Read | 방지 | 방지 | 가능 | 중간 |
Serializable | 방지 | 방지 | 방지 | 낮음 |
결론
트랜잭션 격리 수준은 데이터의 정확성과 성능 사이에서 균형을 맞추는 중요한 개념입니다.
각 애플리케이션의 요구사항에 따라 적절한 격리 수준을 선택하는 게 중요하겠죠
- Read Uncommitted : 성능 우선 작업.
- Read Committed : 일반적인 사용 사례에 적합.
- Repeatable Read : 데이터 일관성이 중요할 때 사용
- Serializable : 최고 수준의 데이터 무결성이 필요할 때 선택
오늘도 긴 글 읽어주셔서 감사합니다.


안녕하세요 인터럽트입니다.
이번 포스팅에서는 DB의 트랜잭션 격리 수준에 대해서 정리해보려고 합니다.
개념은 알고 있지만 미리 정리를 함으로 써 면접 시 좀 더 깔끔한 답변을 할 수 있겠죠?
데이터베이스는 트랜잭션이라는 작업 단위로 묶어서 데이터를 처리합니다.
작업도중 문제가 발생하면 모든 작업을 원래 상태로 rollback 할 수 있어서 데이터의 일관성과 신뢰성을 유지할 수 있습니다.
이 과정에서 동시에 여러 트랜잭션이 수행될 때 발생할 수 있는 문제를 제어하기 위해 필요한 개념이 격리수준(Isolation Level)
입니다.
트랜잭션 격리 수준이란?
트랜잭션 격리 수준은 데이터베이스가 동시에 실행되는 여러 트랜잭션 간의 상호작용을 제어하는 방식입니다.
격리 수준에 따라 트랜잭션 간에 발생할 수 있는 읽기오류, 데이터 일관성 문제
를 방지하는 정도가 달라집니다.
트랜잭션 충돌로 발생할 수 있는 문제
Dirty Read(더티 읽기)
한 트랜잭션이 커밋되지 않은 데이터를 읽는 경우.

Non-Repeatable Read(반복 불가능 읽기)
한 트랜잭션에서 동일한 데이터를 두 번 읽을 때 값이 달라지는 경우

Phantom Read(팬텀 읽기)
한 트랜잭션에서 동일한 조건으로 조회했을 때 추가되거나 삭제된 행으로 결과가 달라지는 경우

트랜잭션 격리 수준의 종류
Read Uncommitted(읽기 미완료 허용)
가장 낮은 격리 수준으로 다른 트랜잭션이 커밋하지 않은 데이터도 읽을 수 있습니다.
특징
- Dirty Read 문제가 발생할 수 있다.
- 성능은 가장 좋지만 데이터 무결성에 취약하다.
사용이유
데이터 정확성보다 성능이 중요한 경우.
--예제
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRANSACTION;
SELECT * FROM Orders;
Read Committed(읽기 커밋 허용)
트랜잭션이 커밋된 데이터만 읽을 수 있습니다.

특징
- Dirty Read 방지
- Non-Repeatable Read 가능성 존재.
사용이유
대부분의 애플리케이션에서 기본적으로 사용하는 격리 수준입니다.
--예제
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
SELECT * FROM Orders WHERE Status = 'Pending';
Repeatable Read(반복 가능 읽기)
트랜잭션이 완료될 때까지 동일한 데이터를 읽을 때 일관성을 보장합니다.

특징
- Dirty Read와 Non-Repeatable 방지.
- Phantom Read 가능성 존재
사용이유
금융, 의료 시스템처럼 데이터 일관성이 중요한 경우.
--예제
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT * FROM Products WHERE Category = 'Books';
Serializable(직렬화)
가장 높은 격리 수준으로, 트랜잭션이 직렬화된 것처럼 순차적으로 실행됩니다.
특징
- Dirty Read, Non-Repeatable, Phantom Read 모두 방지.
- 성능은 가장 낮고, 잠금과 대기 시간이 길어질 수 있음.
사용이유
은행 이체, 재고 관리등 강력한 데이터 무결성이 필요한 경우.
--예제
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM Accounts WHERE Balance > 1000;
격리 수준 비교
격리수준 | Dirty Read | Non-Repeatable Read | Phantom Read | 성능 |
Read Uncommitted | 가능 | 가능 | 가능 | 최고 |
Read Committed | 방지 | 가능 | 가능 | 높음 |
Repeatable Read | 방지 | 방지 | 가능 | 중간 |
Serializable | 방지 | 방지 | 방지 | 낮음 |
결론
트랜잭션 격리 수준은 데이터의 정확성과 성능 사이에서 균형을 맞추는 중요한 개념입니다.
각 애플리케이션의 요구사항에 따라 적절한 격리 수준을 선택하는 게 중요하겠죠
- Read Uncommitted : 성능 우선 작업.
- Read Committed : 일반적인 사용 사례에 적합.
- Repeatable Read : 데이터 일관성이 중요할 때 사용
- Serializable : 최고 수준의 데이터 무결성이 필요할 때 선택
오늘도 긴 글 읽어주셔서 감사합니다.
