[DB] 트랜잭션 & 트랜잭션 격리 수준

2025. 6. 4. 00:20· Computer Science/Databse

1. 트랜잭션(Transaction)

트랜잭션은 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다.

트랜잭션은 모두 수행되거나(Commit), 하나도 수행되지 않아야(Rollback) 데이터의 일관성을 유지할 수 있기 때문에 트랜잭션은 데이터베이스의 신뢰성과 무결성을 보장하는 핵심 개념입니다.

 

■ 트랜잭션이 왜 필요한가요?

트랜잭션은 예기치 못한 시스템 장애나 동시성 문제로부터 데이터의 무결성을 보호하기 위해 필요합니다.

예를 들어, 현금 인출 도중 정전이 발생하거나, 두 사용자가 동시에 같은 계좌를 인출할 경우 데이터가 꼬일 수 있습니다. 이러한 상황에서 트랜잭션을 사용하면, 중간에 문제가 생겨도 전체 작업을 되돌릴 수(Rollback) 있기 때문에 데이터의 정합성과 일관성을 유지할 수 있습니다.

또한, 동시 처리로 인해 방생할 수 있는 충돌을 격리(Isolation)하여 안정적인 시스템을 유지하게 합니다.

 

■ 트랜잭션의 ACID 속성

  • Atomicity(원자성): 트랜잭션 내 연산은 모두 성공하거나 모두 실패하는 것으로 부분 성공은 허용하지 않습니다.
  • Consistency(일관성): 트랜잭션이 완료된 후에는 항상 데이터베이스가 일관된 상태여야 합니다.
  • Isolation(격리성): 트랜잭션이 수행되는 중간에는 다른 트랜잭션이 해당 데이터에 접근할 수 없습니다.
  • Durability(지속성): 트랜잭션이 Commit 되면, 그 결과는 영구적으로 저장되어 시스템 장애가 발생해도 유지됩니다.

■ Commit & Rollback

  • Commit: 트랜잭션이 모든 연산을 성공적으로 마쳤을 때, 그 결과를 데이터베이스에 영구적으로 반영하는 연산입니다.
  • Rollback: 트랜잭션 처리 도중 오류가 발생하거나 실패했을 때, 그 트랜잭션이 실행한 모든 작업을 취소하고 이전 상태로 되돌리는 연산입니다.

이러한 기능을 통해 데이터의 일관성과 원자성을 보장할 수 있습니다.

 

■ 트랜잭션의 상태 변화 과정

  1. Active(활동 중): 트랜잭션이 실행 중이며 연산이 수행되는 상태입니다.
  2. Partially Committed(부분 완료): 트랜잭션이 마지막 명령까지 수행되었지만 아직 Commit되지 않은 상태입니다.
  3. Committed(완료): 트랜잭션이 성공적으로 종료되어 데이터가 반영된 상태입니다.
  4. Failed(장애 발생): 실행 중 오류가 발생한 상태입니다.
  5. Aborted(철회): 트랜잭션이 Rollback되어 작업이 모두 취소된 상태입니다.

이러한 상태 관리를 통해 데이터의 신뢰성과 무결성을 보장할 수 있습니다.

 

2. 트랜잭션 격리 수준(Transaction Isolation Level)

트랜잭션 격리 수준은 동시에 여러 트랜잭션이 실행될 때, 서로 간섭하지 않도록 하기 위한 설정 단계입니다. 이는 트랜잭션 간 데이터의 일관성을 얼마나 보장할 것인지에 대한 수준을 결정합니다.

격리 수준이 높을수록 데이터의 무결성과 일관성이 강하게 보장되지만, 동시성이 낮아지고 성능 저하가 발생할 수 있습니다. 반면, 격리 수준이 낮을수록 성능은 높아지지만, 일관성 문제가 발생할 수 있어 트레이드 오프가 존재합니다.

 

■ Isolation Level 발생 현상

  • Dirty Read: 아직 커밋되지 않은 데이터를 읽는 현상
  • Non-Repeatable Read: 같은 데이터를 두 번 조회했을 때 값이 바뀌는 현상
  • Phantom Read: 조회 범위 내에서 처음에는 없던 레코드가 나중에 생기는 현상

■ Isolation Level

격리 수준 Dirty Read Non-Repeatable Read Phantom Read
Read Uncommitted (Level 0) ✅ 발생 ✅ 발생 ✅ 발생
Read Committed (Level 1) ❌ 차단 ✅ 발생 ✅ 발생
Repeatable Read (Level 2) ❌ 차단 ❌ 차단 ✅ 발생
Serializable (Level 3) ❌ 차단 ❌ 차단 ❌ 차단
  1. Read Uncommitted (레벨 0) - 읽기 미확정
    가장 낮은 수준의 격리 단계로 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있습니다. Dirty Read가 발생할 수 있어 데이터 정합성이 가장 낮습니다. 따라서 성능은 가장 좋지만, 대부분의 실무에서는 사용하지 않습니다.
  2. Read Committed (레벨 1) - 읽기 확정
    커밋된 데이터만 읽을 수 있어 Dirty Read는 방지됩니다. 하지만, 한 트랜잭션 내에서 같은 데이터를 두 번 조회할 때 값이 바뀌는 Non-Repeatable Read는 여전히 발생할 수 있습니다. Oracle, SQL Server의 기본 격리 수준으로, 실무에서 가장 많이 사용됩니다.
  3. Repeatable Read (레벨 2) - 반복 가능 읽기
    트랜잭션 중 조회한 데이터에 공유 잠금을 걸어 Non-Repeatable Read도 방지합니다. 하지만, 조회 범위에 새 레코드가 추가되는 Phantom Read는 여전히 발생할 수 있습니다. MySQL InnoDB의 기본 설정이며, 성능과 일관성의 균형이 어느 정도 잡힌 수준입니다.
  4. Serializable (레벨 3) - 직렬화 가능
    가장 엄격한 격리 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것처럼 보장하기 때문에 모든 이상 현상(Dirty, Non-Repeatable, Phantom Read)을 방지할 수 있습니다. 대신 성능이 크게 저하되고, 동시성이 떨어진다는 단점이 있습니다. 데이터 무결성이 최우선인 회계 시스템 등에서 사용됩니다.

Isolation Level 조정은 동시성이 증가되는 데에 반해 데이터 무결성에 문제가 발생할 수 있고, 데이터의 무결성을 유지하는 데에 반해 동시성이 떨어질 수 있습니다. 또한 레벨이 높아질수록 비용 또한 높아집니다.

728x90

'Computer Science > Databse' 카테고리의 다른 글

[DB] 데이터베이스 풀  (0) 2025.06.03
'Computer Science/Databse' 카테고리의 다른 글
  • [DB] 데이터베이스 풀
kyung.Kh
kyung.Kh
kyung.Kh
Dev..studynote
kyung.Kh
전체
오늘
어제
06-24 06:32
  • 분류 전체보기 (75)
    • Algorithm PS (32)
      • Baekjoon Online Judge (32)
      • Programmers (0)
    • Computer Science (8)
      • Databse (2)
      • Operating System (1)
      • Computer Network (0)
      • Computer Architecture (0)
      • Algorithm (4)
      • Java & Spring (1)
    • Spring (29)
      • Spring Boot (1)
      • 스프링 핵심 원리 - 기본편(인프런 김영한) (7)
      • Java (1)
      • 자바 ORM 표준 JPA 프로그래밍 (20)
    • Project (2)
      • 문제 & 해결 (2)
    • Book (3)
      • 객체지향의 사실과 오해 (3)
    • 우하한테크코스 (1)
      • precourse (1)

최근 글

인기 글

블로그 메뉴

    태그

    • 알고리즘
    • Union-Find
    • 구현
    • BFS
    • 인프런
    • springboot
    • dfs
    • JPA
    • 스프링부트
    • 재귀
    • 스프링 기본편
    • Graph
    • 해시를 사용한 집합과 맵
    • 객체지향
    • Spring
    • 백준
    • 스프링 김영한
    • 스프링
    • 그리디
    • DP
    hELLO · Designed By 정상우.v4.2.2
    kyung.Kh
    [DB] 트랜잭션 & 트랜잭션 격리 수준
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.