본문 바로가기
Web/BackEnd

[Backend] 트랜잭션, 격리 수준

by 희조당 2023. 7. 27.
728x90

🙋 들어가며

데이터를 다룰 때 트랜잭션이라는 용어가 자주 등장합니다.

이번 글에서 우리는 자주 언급되는 트랜잭션이 무엇이고 특징이 어떤 것들이 있는지 알아보고,

주의할 점은 어떤 것들이 있는지 알아보겠습니다.


🤔 트랜잭션이란?

트랜잭션은 특별한 작업의 단위를 의미합니다.

어떤 특징이 있어서 단순한 작업과 다르게 표현을 하는 것일까요?

👀 특징

트랜잭션을 이야기할 때는 ACID라고 부르는 특징을 이해해야 합니다.

ACID를 지키고 있는 단위를 우리는 트랜잭션이라고 부르는 것입니다.

🎭 루미큐브

그림 1 : 루미 큐브

루미큐브는 가장 유명한 보드게임 중 하나입니다.

이 게임은 트랜잭션의 특징과 아주 비슷합니다. 다음은 규칙입니다.

🎯 루미큐브 규칙

  1. 4가지 색을 가진 1부터 13까지 숫자가 존재한다.
  2. 필드에 제출된 숫자들은 같은 색상의 연속된 숫자이거나 혹은 색이 다르지만 같은 숫자로 개수가 반드시 3 이상이어야 한다. 필드에 있는 숫자들을 공유할 수 있다.

그림 2 : 제출 할 수 있는 패턴

  1. 2번 조건을 만족한다면 계속 필드에 제출할 수 있다.
  2. 제출한 숫자들이 조건에 맞지 않으면 필드는 이전 상태로 돌아간다.

💉 ACID 원칙

ACID 원칙이란 트랜잭션을 다른 작업 단위와 구분할 수 있는 특징이자 조건입니다.

원자성, 일관성, 독립성, 지속성 4가지 특징이 있고 영어의 각 앞글자만 따서 ACID라고 부릅니다.

앞서 소개해드린 루미큐브의 규칙과 빗대서 ACID 원칙을 이해해보겠습니다.

⚛️ Atomicity (원자성)

원자성이란, 한 작업의 단위가 모두 실패하거나 모두 성공해야 함을 의미합니다.

루미큐브에서 예시를 한번 찾아보겠습니다.

 

이기기 위해서 자신의 차례가 왔을 때 어떻게든 숫자를 제출해야 합니다.

제출한 숫자들이 규칙 2번을 위반하지 않는다면 계속해서 제출이 가능합니다.

그림 3 : 무진장 내는 중

하지만 규칙 2번을 어긴다면, 이전 상태로 돌아가야 하는 규칙 4번에 따라 처음 상태로 돌아갑니다.

그림 4 : 규칙 2번 위반, 롤백!

여기서 바로 규칙 4번이 원자성을 의미합니다.

처음 제출한 숫자들이 규칙 2번을 지켰지만 다음 숫자들이 지키지 못한다면 원래대로 돌아갑니다.

 

이처럼 원자성을 만족하는 트랜잭션에서는 하나라도 실패하면 처음 상태로 돌아갑니다.

모두 성공해야만 하나의 작업이 끝날 수 있습니다.

🏃 Consistency (일관성)

일관성이란, 트랜잭션이라는 작업을 수행한 뒤에도 상태가 같아야 함을 의미합니다.

루미큐브에서 누군가의 턴이 지나도 필드 위의 숫자들은 항상 규칙 2번을 만족해야 합니다.

이것이 일관성입니다. 트랜잭션을 수행하면 항상 따르던 규칙을 지켜야 합니다.

🗼 Isolation (독립성)

고립성이란, 트랜잭션을 수행하는 도중에 다른 트랜잭션이 끼어들 수 없음을 의미합니다.

루미큐브에서 제 차례가 저만 온전하게 필드에 있는 숫자들을 조합하고 제출할 수 있습니다.

이것이 고립성이 의미하는 바입니다. 어떤 트랜잭션을 수행 중일 때는 다른 트랜잭션에 영향을 받지 않습니다.

📷 Durability (지속성)

지속성이란, 트랜잭션이 완료되면 작업의 결과가 지속된다는 것을 의미합니다.

현실에서는 누군가 판을 엎으면 그만이기 때문에 폰으로 루미큐브를 한다고 가정해 보겠습니다.

그림 5 : 재접속해도 필드는 그대로이다.

게임을 진행하던 중 숫자들을 모두 제출하고 실수로 종료를 했어도 다시 들어오는데 문제가 없습니다.

이는 게임이 종료되지 않는 한 아무리 문제가 발생해도 그대로 필드가 유지됩니다.

이게 바로 지속성이 의미하는 바입니다.

🤷‍♂️ 왜 사용하나요?

루미큐브에서 숫자를 다루는 것처럼 트랜잭션은 어떤 데이터를 다루기 위해서 사용합니다.

앞서 공부한 특징들을 지킴으로써 보다 안전하게 데이터를 다루기 위함입니다.

🎛️ 트랜잭션 연산

트랜잭션은 두 가지 연산이 존재합니다. 간단하게 알아보겠습니다.

  • ↩️ Rollback (롤백) : 루미큐브에서 이전 상태로 돌아가는 현상롤백이라고 부릅니다.
  • ▶️ Commit (커밋) : 숫자를 규칙 2번을 만족한다면 필드에 올릴 수 있습니다. 이렇게 작업이 성공적일 때 결과를 반영하는 것을 의미합니다.

🔫 격리 수준

트랜잭션은 독립성을 지원한다는 의미는 모든 데이터를 트랜잭션 순서에 맞게 처리하는 것을 의미합니다.

물론 안전하게 데이터를 다룰 수 있지만, 너무 많은 요청이 들어온다면 좋은 성능을 기대하기 어려울 것 같습니다.

격리(독립) 수준을 조금 조정한다면 성능 향상을 기대할 수 있습니다.

🫡 다양한 격리 수준

1️⃣ Read Uncommitted, 레벨 0

어떠한 제약도 걸려있지 않은 격리 수준입니다.

2️⃣ Read Commited, 레벨 1

Commit된 데이터만 읽는 격리 수준입니다.

대부분의 DBMS가 사용하는 수준입니다.

3️⃣ Repeatable Read, 레벨 2

이전 트랜잭션에서 Commit된 데이터만 읽는 격리 수준입니다.

MySqlMariaDB의 기본 수준입니다.

4️⃣ Serializable, 레벨 3

ACID 그 자체를 지키는 수준입니다.

트랜잭션을 수행 중이라면 다른 트랜잭션은 기다려야 합니다.

🫨 이상 현상

프로그래밍에서 의도치 않은 결과를 우리는 Error라고 표현합니다.

동일하게 각 수준에서 의도치 않은 결과가 발생하는 현상을 말합니다.

3가지 이상 현상이 존재합니다.

그림 6 : 이상 현상과 격리 수준

🗑️ Dirty Read

레벨 0 수준에서 발생하는 이상 현상입니다. Uncommitted Dependency라고도 불립니다.

작업이 완료되지 않은 데이터를 가져올 때 발생합니다.

그림 7 : Dirty Read

Dirty Read는 흔하게 볼 수 있는 현상입니다. 예를 들어보겠습니다.

오늘은 월급날 치킨을 FLEX 할 생각입니다. 💰 😎 💸
핫 황금 올리브를 주문을 했고, 50분 뒤에 도착할 예정이라고 알람이 왔습니다.
시간에 맞춰서 볼 유튜브를 켜놓고 아껴두었던 원소주를 꺼내놨습니다.
시간이 지나도 도착하지 않길래 혹시 해서 확인 전화를 했습니다.
뭐..? 주문이 취소되었어..😱?

이렇게 확정되지 않은 데이터를 가져옴으로 예기치 못한 상황이 발생할 수 있습니다.

🔁 Non-Repeatable Read

레벨 0, 레벨 1 수준에서 발생하는 이상 현상입니다. Inconsistent Analysis라고도 불립니다.

중간에 커밋된 데이터를 가져와 한 트랜잭션 내에서 SELECT에 대해서 다른 결과물을 가져올 때 발생합니다.

이름 그대로 읽기(Read) 반복 작업에 대해서 신뢰성이 없는 것을 의미합니다.

그림 8 : Non-Repeatable Read

이번에도 비슷하게 Non-Repeatable Read 예시를 들어보겠습니다.

오늘 퇴근 후 지친 심신을 달래기 위해서 저녁은 치킨을 영접할 생각입니다. 🍗
경건한 마음으로 장바구니에 담았습니다. 이제 결제 페이지로 넘어가 결제만 하면 됩니다.
근데 갑자기 재고가 없어서 주문을 할 수 없다고 합니다. 아니 그러면 결제 페이지로 넘어가지 말지!

이렇게 작업이 이루어지고 있는 동안 데이터가 변경되어 다시 확인했을 때 다른 결과가 나오는 현상을 의미합니다.

👻 Phantom Read

레벨 0, 레벨 1, 레벨 2 수준에서 발생하는 이상 현상입니다.

트랜잭션 내에 작성하거나 삭제하지 않은 데이터가 유령처럼 등장할 때를 의미합니다.

그림 9 : Phantom Read

마지막 Phantom Read의 가벼운 예시입니다.

무더운 날 몸 보신할 겸 치킨을 주문하려고 합니다.
근데 오늘따라 입맛을 살려줄 핫황올이 너무나도 땡깁니다.
장바구니에 담고 결제를 하려고 보니 갑자기 텅 비어있습니다. 아니 뭔데?

아마 중간 매장에서 핫황올이라는 메뉴를 삭제한 것 같습니다. 🥹

그 결과 우리는 추가한 데이터가 없는 데이터(유령 데이터)가 되었습니다.

 

이렇게 한 작업 내에서 추가 정보가 생기거나 정보가 삭제되는 현상을 의미합니다.

🧐 무엇을 고려할까요?

높은 수준이 꼭 좋은 것만은 아니고 낮은 수준이 꼭 나쁜 것만은 아닙니다.

낮은 수준은 빠르고 높은 수준은 안전합니다. 여기서 알아야 할 개념이 있습니다.

  • 동시성 (Concurrency) : 빠르게 처리할 수 있는 양
  • 일관성 (Consistency) : 데이터가 안전한 정도

그림 10 : 동시성과 일관성의 관계

동시성과 일관성은 서로 반비례 관계에 있습니다.

따라서, 데이터의 중요도와 처리량을 고려해서 설정하는 것이 중요합니다. 😋😋


😎 정리

  • 트랜잭션은 하나의 작업 단위이다.
  • 트랜잭션ACID라는 특징을 가진다.
  • 안전하게 데이터를 다루기 위해서 트랜잭션을 사용한다.
  • 너무 FM하지 않으려고 격리 수준을 나누었다.
  • 각 수준마다 발생하는 문제점이 존재한다.
  • 데이터의 중요도와 처리량을 고려해서 수준을 설정해야 한다.

😋 지극히 개인적인 블로그지만 댓글과 조언은 제 성장에 도움이 됩니다 😋

'Web > BackEnd' 카테고리의 다른 글

[Backend] flyway 사용하기  (0) 2023.10.11
[Backend] DB 인덱스 이해하기  (0) 2023.08.04
[BackEnd] MapStruct 사용기  (3) 2023.05.13
[BackEnd] Enum 유효성 검사 구현기  (1) 2023.04.25
[AWS] AWS 인프라 구축하기 - CodeDeploy (5)  (0) 2023.04.05

댓글