[데이터베이스]트랜잭션이란? 격리수준이란?

2025. 4. 7. 16:19·CS/데이터베이스

안녕하세요.. 블로거 절박한 개발자입니다.

이번 글은 트랜잭션이 무엇인지?? 트랜잭션의 특징에 알아보고자 합니다. 간단하고 짧게 적을 예정입니다.

 

트랜잭션이란?

트랜잭션이란 데이터베이스에서 하나의 작업 단위로, 모두 수행되거나 전혀 수행되지 않아야 하는 원자적 작업입니다.

예시로 우리가 판매자와 구매자와 상품을 거래한다고 가정해봅시다. 구매자의 계좌에서 잔액을 상품의 금액 만큼 차감시킨후 판매자의 계좌에 금액을 충전시키는게 하나의 상품 거래작업(트랜잭션)입니다.

 

트랜잭션의 특징

트랜잭션의 특징은 4가지가 존재합니다. 

  1. 원자성 : 트랜잭션이 데이터베이스에 모두 반영되거나, 전혀 반영이 되지 않거나
    • 예를 들어, 판매자의 계좌에서 돈이 빠져나갔는데 구매자의 계좌에 입금되지 않는 일은 없어야 합니다.
  2. 일관성 : 트랜잭션 수행 전후의 데이터는 항상 정해진 제약 조건을 만족하는 일관된 상태를 유지해야 합니다
  3. 독립성 : 둘 이상의 트랜잭션이 동시에 실행되고있는 경우 그 어떤 트랜잭션도 연산에 끼어들 수 없다.
  4. 영구성 : 결과는 영구적으로 반영되어야한다.

트랜잭션 격리 수준

https://gahacman.tistory.com/46
제가 앞서 포스팅한 MYSQL의 아키텍처 글도 보시면 더 도움이 될꺼 같습니다.

 

트랜잭션 격리 수준이란 여러 트랜잭션이 동시에 실행될 때,얼마나 서로를 고립시킬지를 결정하는 단계 입니다.

고립도가 낮을수록 성능은 좋지만, 데이터 정합성이 깨질 가능성이 높아지고, 반대로 고립도가 높을수록 안전하지만 성능 저하가 발생할 수 있습니다.

  • READ UNCOMMITED
  • READ COMMITED
  • REPEATABLE READ
  • SERIALIZABLE

READ UNCOMMITED

커밋되지 않은 데이터를 다른 트랜잭션에서 조회할 수 있도록 허용하는 수준입니다.

해당 격리는 Dirty Read 문제가 발생할 수 있습니다.

Dirty Read : 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽은것을 의미한다.

아래의 상황같이 롤백이 된다면 그 데이터는 실제로 존재하지 않는 값이 되어버립니다.

 

 

1. 트랜잭션 B가 사용자의 잔고를 100에서 50으로 변경하였지만 아직 커밋은 하지 않음

2. 그 사이 트랙잭션 A가 같은 계좌를 조회했더니 50으로 보임

3. 트랜잭션 B가 롤백하면 잔고는 다시 100으로 돌아감

4. 하지만 트랜잭션 A는 그 사이를 모르기에 잘못된 정보로 데이터를 처리함.

 

A가 커밋되지 않는 데이터를 읽는걸 Dirty Read라고 합니다.

READ COMMITED

이와 반대로 READ COMMITED는 커밋된 데이터만을 읽을 수 있는 격리 수준입니다.

커밋된 기록만 보기에 이전에 커밋된 Undo Log에서 데이터를 읽어옵니다.

Undo Log : 커밋되기전 변경된 데이터를 백업해둔 공간

 

해당 격리 수준에서는 Non-Repeatable Read 문제가 발생할 수 있습니다.
이는 하나의 트랜잭션 내에서 같은 데이터를 두 번 이상 조회했을 때, 중간에 다른 트랜잭션이 해당 데이터를 수정하고 커밋하면 조회 결과가 일치하지 않는 현상을 의미합니다.

REPEATABLE READ

Non Repeatable Read 문제를 해결한 격리 수준입니다. 한 트랜잭션 내에서 같은 데이터를 두번 이상 조회 해도 같은 결과를 보장합니다.

MySQL(InnoDB)의 기본 격리 수준입니다.

스냅샷 : 트랜잭션이 시작되었을 때, 그 시점의 데이터 상태를 기억 해서 이후 쿼리를 실행할 때 항상 그 시점의 데이터만을 읽게 해주는 기능

 

일반적인 DBMS SELECT FOR UPDATE 상황

일반적인 DBMS는 SELECT FOR UPDATE가 사용되는 경우 문제가 발생합니다.

아래의 그림과 같이 똑같은 조회를 했는데 새로운 행이 조회된 문제를 볼 수 있습니다.

이와 같은 문제를 PHANTOM READ라 합니다.

SELECT FOR UPDATE : 쓰기 위한 조회 ( 조회하는 행의 데이터를 락을 건다-> 아무도 접근 못하게 한다) 하지만 데이터 삽입같은건 맞지 못한다. SELECT와 달린 Undo Log를 읽지 않고 테이블의 값을 읽는다.

PHANTOM READ : 같은 트랜잭션 내에서 동일한 쿼리를 반복 실행했을 때 다른 트랜잭션에 의해 새로운 데이터 행이 삽입
혹은 삭제된 현상

 

하지만 MySQL 에서는 REPEATABLE READ 수준에서 Phantom Read를 방지하기 위해 검색 조건 범위에 해당하는 모든 인덱스 행에 잠금을 걸어버립니다. 즉 새로운 데이터 삽입을 방지합니다.

 

SERIALIZABLE

한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없는 트랜잭션 격리 수준.

모든 읽기/쓰기에 잠금을 겁니다. 그렇기에 아무 문제가 발생하지 않습니다.

 

참조 : 

https://www.youtube.com/watch?v=QHWwNTGkwAU&t=413s

 

지금까지 트랜잭션과 격리 수준에 대해 알아보았습니다.👍 제 이번 글은 MYSQL을 기준으로 삼아서 거의 설명을 드린거 같습니다. 다른 DB는 어떻게 동작하는지 알고 싶으신 분들은 따로 공부를 하는걸 추천드리겠습니다.

글을 읽어 주셔서 감사합니다.😁

'CS > 데이터베이스' 카테고리의 다른 글

[MySQL] 실행계획 -1  (0) 2025.05.12
[데이터베이스] MySQL 인덱스 - 2  (1) 2025.05.02
[데이터베이스] MySQL 인덱스  (1) 2025.05.01
[DataBase] MYSQL 아키텍처  (0) 2025.03.04
[DataBase] B-tree 와 B+tree에 대하여  (0) 2025.03.03
'CS/데이터베이스' 카테고리의 다른 글
  • [데이터베이스] MySQL 인덱스 - 2
  • [데이터베이스] MySQL 인덱스
  • [DataBase] MYSQL 아키텍처
  • [DataBase] B-tree 와 B+tree에 대하여
절박한개발자
절박한개발자
깃허브 주소 : https://github.com/Kzerojun
  • 절박한개발자
    절박한개발
    절박한개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • Server (5)
      • 프로젝트 (7)
      • Spring (7)
      • AI (1)
      • JPA (6)
      • JAVA (7)
      • Backend (3)
      • WEB (3)
      • 알고리즘-이론 (6)
      • 알고리즘-문제 (28)
      • CS (24)
        • 데이터베이스 (8)
        • Network (5)
        • OS (10)
        • LINUX (1)
      • 개발면접준비 (1)
      • 기타 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CPU
    2
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
절박한개발자
[데이터베이스]트랜잭션이란? 격리수준이란?
상단으로

티스토리툴바