본문 바로가기
DATABASE/Databse

[Database] 트랜잭션(Transaction)과 격리 수준(Isolation Level)

by DANEW 2023. 7. 16.

Intro

안녕하세요.
초보 DBA 다뉴입니다.

오늘은 트랜잭션의 격리수준에 대해 공부한 내용에 대해 이야가 나눠볼까 합니다.


트랜잭션 (Transaction)

트랜잭션 이란?

트랜잭션은
더 이상 나눌 수 없는 하나의 논리 작업 단위를 뜻 합니다.

가장 많은 예시로 드는 것이 은행의 송금 시스템 인데요.
A의 통장에서 10만원을 B의 통장으로 보낼 때,

1. A의 통장에 10만원을 뺀다.
2. B의 통장에 10만원을 넣는다.

이렇게 두 단계의 일을 하는데요


이럴 때 송금이라는 작업에 대해서는 두가지 일이 다 이루어져야 송금 이라는 작업이 완료가 되므로,

송금이라는 1, 2번 단계의 일에 대해서 하나의 트랜잭션으로 묶이게 됩니다.

이렇게 작업에 여러 단계가 있어도 그 작업을 이루는 최소한의 일들의 묶음을 트랜잭션 이라고 합니다.

트랜잭션은 정상적으로 완료되었을 경우 커밋(commit), 오류가 발생 했을 경우 롤백(rollback)이 되어야 합니다.

정상적으로 송금이 완료 되면, A에게서 10만원 차감 B에게 10만원 증감을 합니다. (commit)
1단계 완료 후 2단계 중에 오류가 발생할 경우는 A에게 10만원 차감 B에 변화 없음이 아닌 1, 2 단계가 실행 전 (즉, 트랜잭션 실행 전) 으로 되돌립니다. (rollback)

트랜잭션의 특징 (ACID)

위에 설명한 부분을 포함한 트랜잭션의 특징을 알아보겠습니다.
앞 글자를 따와서 ACID라고 합니다.

  • 원자성 (Atomicity)
  • 일관성 (Consistency)
  • 격리성 (Isolation)
  • 지속성 (Durability)

1. 원자성 (Atomicity)

트랜잭션의 작업이 모두 반영 되거나, 반영 되지 않아야 합니다.
트랜잭션이 성공적으로 완료되면 모든 단계의 일이 반영되고(commit), 도중에 오류가 발생 할 경우 모두 반영 되지 않아야 합니다(rollback).

 

위에 설명 한 내용인 은행 송금 예시를 생각하면 될 것 같습니다.

2. 일관성 (Consistency)

트랜잭션의 작업 처리 결과값과 상태가 항상 일괄되어야 합니다.

트랜잭션이 진행되는 동안 데이터베이스가 변경이 있더라도, 변경된 데이터베이스로 트랜잭션이 진행되는 것이 아닌, 처음 트랜잭션 시작 때 참조한 데이터베이스로 진행하여, 일괄된 결과 값을 받을 수 있게 합니다.

 

데이터베이스의 고정요소 혹은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들이 유지 되어야합니다.

한 테이블의 값이 변경 되었을 때 키로 연결되어있는 다른 모든 테이블이 함께 변경되어 일괄성을 유지해야 합니다.

 

송금 예시의 A, B의 총 잔액 등이 일괄성있어야 합니다.

3. 격리성 (Isolation)

하나의 트랜잭션이 작업 시 다른 트랜잭션에 방해를 받지 않아야 합니다.

즉, 각각 따로따로 트랜잭션이 진행되어야 하며 서로에게 영향을 주면안됩니다.

이렇게 영향을 주고 받지 않기 위해서 데이터에 대한 접근 제어가 필요합니다.

4.지속성 (Durability)

트랜잭션이 성공적으로 완료되면, 해당 내용은 영구적으로 데이터베이스에 저장되어야 합니다.

반응형

트랜잭션의 문제

위에 설명 한 트랜잭션의 4가지 특징에 대해서,

트랜잭션은 원자성, 일관성, 지속성은 보장하지만 문제는 격리성입니다.

격리성을 완벽하게 유지하려면 차례대로 트랜잭션을 진행하여 처리 속도가 매우 느리고, 느슨하게 유지하면 여러 문제가 발생합니다.

이러한 단계를 나누어 격리수준(Isolation Level) 4단계로 나누어 정의하고 있습니다.


격리 수준(Isolation Level)

격리 수준에 따라 발생할 수 있는 문제 3가지

격리 수준에 대해 총 3가지 문제로 정의됩니다.

  • Dirty Read
  • Non-Repeatable Read
  • Phantom Read

Dirty Read

한 트랜잭션에서 처리 중인 작업이 완료되지 않았음에도 다른 트랜잭션에서 해당 내용을 조회 할 수 있는 현상

Non-Repeatable Read

동일한 Select Query를 실행했을 때, 다른 결과가 보여지는 현상

한상 같은 결과를 보장하는 Repeatable Read 정합성에 어긋남

Pantom Read

한 트랜잭션에서 동일한 쿼리를 여러번 실행하였는데, 앞선 쿼리에서 존재하지 않던 유령 레코드가 발생하는 현상

격리 수준의 4단계

격리 수준은 나열한 순서대로 가장 낮은 수준 -> 높은 수준이다.

  • Read Uncommitted
  • Read Committed
  • Repeatable Read
  • Serializable

Read Uncommitted

가장 낮은 수준의 격리 수준으로

트랜잭션의 커밋 되지 않은 데이터를 다른 트랜잭션에서 접근이 가능한 격리 수준이다.

 

Dirty Read, Non-Repeatable Read, Pantom Read 3가지 문제가 모두 발생 할 수 있다.

Read Committed

가장 많이 사용되는 격리 수준으로

트랜잭션의 커밋 된 데이터만 다른 트랜잭션에서 접근이 가능한 격리 수준이다.

 

Dirty Read를 제외한, Non-Repeatable Read, Pantom Read 2가지 문제가 발생 할 수 있다.

Repeatable Read

트랜잭션 내에서 항상 같은 데이터만 조회된다.

즉, 트랜잭션이 실행되기전 조회된 내용으로만 조회가 된다.

 

Dirty Read를 포함한, Non-Repeatable Read가 발생하지 않으며, Pantom Read만 발생 할 수 있다.

Serializable

가장 높은 격리 수준이며

해당 트랜잭션은 읽기 작업도 공유잠금이 걸리며, 처리속도가 매우 느려진다.

한 트랜잭션에서 읽고 쓰는 데이터에 대해서 다른 트랜잭션은 절대 접근 불가이다.

 

Dirty Read, Non-Repeatable Read, Pantom Read 3가지 문제가 모두 발생하지 않는다.


Outro

트랜잭션과 트랜잭션의 격리 수준에 대해서 알아보았는데요.

이렇게 말로만 풀어서 쓰면, 잘 이해가 되지 않을 때가 있습니다.

 

한번 세션을 여러 개 만들어서 한번씩 테스트 해보시는게 어떨까 싶네요!!

저도 이론적으로는 공부했으니 한번 다시 테스트 해보도록 하겠습니다.

 

감사합니다.

반응형