트랜잭션 - ACID 원칙, Problem 3가지

2024. 11. 11. 14:51·👶🏻 CS/Database

트랜잭션(Transaction)이란

트랜잭션은 데이터베이스에서 하나의 작업 단위를 의미한다.

 

예제

은행에서의 계좌이체를 생각해 보자. 만약 한 계좌에서 다른 계좌로 1,000원을 이체하는 작업은 다음과 같은 단계로 나눌 수 있다.

  1. A 계좌에서 1,000원을 출금한다.
  2. B 계좌에 1,000원을 입금한다.

계좌이체라는 행위를 출금, 입금이라는 두 작업으로 이루어진다.


이 두 작업은 반드시 함께 수행되어 둘 다 성공하거나 둘 다 실패해야 한다. 만약 A 계좌에서 돈이 빠져나갔는데 B 계좌에 입금되지 않는다면, 데이터가 불일치하게 되어 문제가 발생할 것이다.


이 과정을 동시에 묶는 방법이 바로 트랜잭션이다.

 

트랜잭션의 주요 특성 (ACID)

트랜잭션은 데이터의 무결성을 보장하기 위해 ACID 특성을 만족해야 한다.
ACID는 다음의 4가지 특성으로 구성된다

 

Atomicity(원자성)

트랜잭션이 모든 작업을 완벽히 실행하거나 전혀 실행하지 않아야 함을 의미한다. 즉, 작업이 중간에 실패하면 전체 트랜잭션이 롤백되어야 한다.

 

Consistency(일관성)

트랜잭션이 완료되면 데이터베이스는 항상 일관된 상태를 유지해야 한다.

 

Isolation(고립성)

둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 각 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다.
즉, 하나의 트랜잭션이 완료되기 전에는 다른 트랜잭션이 그 데이터를 변경할 수 없어야 한다.

하지만 고립성을 보장하기 위해 무차별적으로 Lock을 걸다 보면 대기시간이 매우 길어지므로 트랜잭션은 최소한으로 사용해야 한다.

 

Durability(지속성)

트랜잭션이 성공적으로 완료된다면, 그 결과가 데이터베이스에 영구적으로 반영되어야 한다.

 

 

트랜잭션 상태

트랜잭션은 작업이 진행됨에 따라 다음과 같은 상태를 거친다

활성(Active)

트랜잭션이 시작되어 작업이 진행 중인 상태

 

부분 완료(Partially Committed)

트랜잭션의 마지막 명령이 실행된 직후의 상태, 그러나 아직 commit된 것은 아니며 시스템 장애가 발생할 경우 트랜잭션이 취소될 수 있다.

 

커밋(commit) : 트랜잭션을 완료하고, 모든 변경 사항을 데이터베이스에 영구적으로 반영하는 연산

 

완료(Committed)

트랜잭션이 성공적으로 완료되어 모든 변경 사항이 데이터베이스에 영구적으로 반영된 상태

 

실패(Failed)

트랜잭션에 오류가 발생해 더 이상 진행할 수 없는 상태

 

철회(Aborted)

트랜잭션이 실패하고 rollback되어 데이터베이스가 원래 상태로 복구된 상태

 

롤백(rollback) : 트랜잭션을 중단하고, 이미 수행된 모든 변경 사항을 되돌리는 연산

 

 

트랜잭션에서 발생할 수 있는 문제들

트랜잭션이 동시에 여러 개 수행될 때, 트랜잭션 간의 상호작용으로 인해 데이터 일관성과 정확성에 문제가 발생할 수 있다. 대표적인 트랜잭션 문제로 3가지가 있다.

 

1. Dirty Read Problem

한 트랜잭션이 커밋되지 않은 다른 트랜잭션의 데이터를 읽을 때 발생한다.
이 문제는 트랜잭션이 아직 완료되지 않아 확정되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있게 될 때 발생한다.


트랜잭션 1에서 data2 를 insert하고 커밋하지 않은 상태에서
트랜잭션 2가 data2 를 읽으면 data2는 커밋될지 롤백될지 알 수 없다.

 

2. Non-repeatable Read Problem

한 트랜잭션이 같은 데이터를 2번 이상 조회했을 때 그 값이 다르게 나오는 경우를 말한다.
이는 한 트랜잭션 도중 다른 트랜잭션이 데이터를 수정/삭제하고 커밋할 경우 발생할 수 있다.

트랜잭션 2가 key가 2인 데이터의 값을 "updated"로 수정하고 커밋했다.
트랜잭션 1은 수정 전에 데이터를 select한 결과와 수정 후의 select 결과가 다르게 조회한다.

 

3. Phantom Read Problem

한 트랜잭션 내에서 같은 쿼리를 여러 번 실행했을 때, 처음에는 없던 데이터가 나중에 조회되는 경우를 말한다.


트랜잭션1이 데이터를 조회하는 도중에 트랜잭션 2가 data3을 insert하고 커밋할 경우
트랜잭션 1에서는 처음에 안 보였던 Phantom(유령, 환상) 데이터가 나타나게 된다.
보통 데이터의 삽입이 발생했을 경우 발생한다.

 

 

 

 

 

참고
트랜잭션의 격리성 문제 - Dirty Read / Non-Repeatable Read / Phantom Read

저작자표시 비영리

'👶🏻 CS > Database' 카테고리의 다른 글

인덱스(B-Tree, B+Tree)  (0) 2024.11.19
정규화와 비정규화  (0) 2024.11.17
NoSQL이란?  (0) 2024.11.16
'👶🏻 CS/Database' 카테고리의 다른 글
  • 인덱스(B-Tree, B+Tree)
  • 정규화와 비정규화
  • NoSQL이란?
현주먹
현주먹
끄적끄적 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (162)
      • 👶🏻 CS (15)
        • Operating System (8)
        • Database (4)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • JPA (5)
        • Test Code (1)
        • Database (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (57)
        • 후기 및 회고 (5)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL
  • 인기 글

  • 태그

    자바의정석
    C
    개발자멘토링
    jsp
    인프런 단어뒤집기
    티스토리챌린지
    F-Lab
    객체지향
    NextSTEP
    에프랩 후기
    f-lab 후기
    PostGreSQL함수
    인프런 특정문자뒤집기
    개발자취업
    에프랩
    코딩테스트준비
    자바의신절판
    항해99
    오라클
    데브클럽
    백준
    코테스터디
    백준10250
    JPA
    TDD 클린 코드 with Java
    til
    99클럽
    ==와 equals()
    로또 미션
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
현주먹
트랜잭션 - ACID 원칙, Problem 3가지
상단으로

티스토리툴바