🙋 들어가며
데이터를 다룰 때 트랜잭션
이라는 용어가 자주 등장합니다.
이번 글에서 우리는 자주 언급되는 트랜잭션
이 무엇이고 특징이 어떤 것들이 있는지 알아보고,
주의할 점은 어떤 것들이 있는지 알아보겠습니다.
🤔 트랜잭션이란?
트랜잭션
은 특별한 작업의 단위를 의미합니다.
어떤 특징이 있어서 단순한 작업과 다르게 표현을 하는 것일까요?
👀 특징
트랜잭션을 이야기할 때는 ACID
라고 부르는 특징을 이해해야 합니다.
ACID
를 지키고 있는 단위를 우리는 트랜잭션
이라고 부르는 것입니다.
🎭 루미큐브
루미큐브
는 가장 유명한 보드게임 중 하나입니다.
이 게임은 트랜잭션
의 특징과 아주 비슷합니다. 다음은 규칙입니다.
🎯 루미큐브 규칙
- 4가지 색을 가진 1부터 13까지 숫자가 존재한다.
- 필드에 제출된 숫자들은 같은 색상의 연속된 숫자이거나 혹은 색이 다르지만 같은 숫자로 개수가 반드시 3 이상이어야 한다. 필드에 있는 숫자들을 공유할 수 있다.
- 2번 조건을 만족한다면 계속 필드에 제출할 수 있다.
- 제출한 숫자들이 조건에 맞지 않으면 필드는 이전 상태로 돌아간다.
💉 ACID 원칙
ACID
원칙이란 트랜잭션
을 다른 작업 단위와 구분할 수 있는 특징이자 조건입니다.
원자성, 일관성, 독립성, 지속성 4가지 특징이 있고 영어의 각 앞글자만 따서 ACID
라고 부릅니다.
앞서 소개해드린 루미큐브
의 규칙과 빗대서 ACID
원칙을 이해해보겠습니다.
⚛️ Atomicity (원자성)
원자성이란, 한 작업의 단위가 모두 실패하거나 모두 성공해야 함을 의미합니다.
루미큐브
에서 예시를 한번 찾아보겠습니다.
이기기 위해서 자신의 차례가 왔을 때 어떻게든 숫자를 제출해야 합니다.
제출한 숫자들이 규칙 2번
을 위반하지 않는다면 계속해서 제출이 가능합니다.
하지만 규칙 2번
을 어긴다면, 이전 상태로 돌아가야 하는 규칙 4번
에 따라 처음 상태로 돌아갑니다.
여기서 바로 규칙 4번
이 원자성을 의미합니다.
처음 제출한 숫자들이 규칙 2번
을 지켰지만 다음 숫자들이 지키지 못한다면 원래대로 돌아갑니다.
이처럼 원자성
을 만족하는 트랜잭션
에서는 하나라도 실패하면 처음 상태로 돌아갑니다.
모두 성공해야만 하나의 작업이 끝날 수 있습니다.
🏃 Consistency (일관성)
일관성이란, 트랜잭션
이라는 작업을 수행한 뒤에도 상태가 같아야 함을 의미합니다.
루미큐브
에서 누군가의 턴이 지나도 필드 위의 숫자들은 항상 규칙 2번
을 만족해야 합니다.
이것이 일관성
입니다. 트랜잭션
을 수행하면 항상 따르던 규칙을 지켜야 합니다.
🗼 Isolation (독립성)
고립성이란, 트랜잭션
을 수행하는 도중에 다른 트랜잭션
이 끼어들 수 없음을 의미합니다.
루미큐브
에서 제 차례가 저만 온전하게 필드에 있는 숫자들을 조합하고 제출할 수 있습니다.
이것이 고립성
이 의미하는 바입니다. 어떤 트랜잭션
을 수행 중일 때는 다른 트랜잭션에 영향을 받지 않습니다.
📷 Durability (지속성)
지속성이란, 트랜잭션
이 완료되면 작업의 결과가 지속된다는 것을 의미합니다.
현실에서는 누군가 판을 엎으면 그만이기 때문에 폰으로 루미큐브
를 한다고 가정해 보겠습니다.
게임을 진행하던 중 숫자들을 모두 제출하고 실수로 종료를 했어도 다시 들어오는데 문제가 없습니다.
이는 게임이 종료되지 않는 한 아무리 문제가 발생해도 그대로 필드가 유지됩니다.
이게 바로 지속성
이 의미하는 바입니다.
🤷♂️ 왜 사용하나요?
루미큐브
에서 숫자를 다루는 것처럼 트랜잭션
은 어떤 데이터
를 다루기 위해서 사용합니다.
앞서 공부한 특징들을 지킴으로써 보다 안전하게 데이터를 다루기 위함입니다.
🎛️ 트랜잭션 연산
트랜잭션
은 두 가지 연산이 존재합니다. 간단하게 알아보겠습니다.
- ↩️ Rollback (롤백) :
루미큐브
에서 이전 상태로 돌아가는 현상을롤백
이라고 부릅니다. - ▶️ Commit (커밋) : 숫자를
규칙 2번
을 만족한다면 필드에 올릴 수 있습니다. 이렇게 작업이 성공적일 때 결과를 반영하는 것을 의미합니다.
🔫 격리 수준
트랜잭션
은 독립성을 지원한다는 의미는 모든 데이터를 트랜잭션
순서에 맞게 처리하는 것을 의미합니다.
물론 안전하게 데이터를 다룰 수 있지만, 너무 많은 요청이 들어온다면 좋은 성능을 기대하기 어려울 것 같습니다.
격리(독립) 수준을 조금 조정한다면 성능 향상을 기대할 수 있습니다.
🫡 다양한 격리 수준
1️⃣ Read Uncommitted, 레벨 0
어떠한 제약도 걸려있지 않은 격리 수준입니다.
2️⃣ Read Commited, 레벨 1
Commit
된 데이터만 읽는 격리 수준입니다.
대부분의 DBMS가 사용하는 수준입니다.
3️⃣ Repeatable Read, 레벨 2
이전 트랜잭션에서 Commit
된 데이터만 읽는 격리 수준입니다.
MySql
과 MariaDB
의 기본 수준입니다.
4️⃣ Serializable, 레벨 3
ACID
그 자체를 지키는 수준입니다.
트랜잭션
을 수행 중이라면 다른 트랜잭션
은 기다려야 합니다.
🫨 이상 현상
프로그래밍에서 의도치 않은 결과를 우리는 Error
라고 표현합니다.
동일하게 각 수준에서 의도치 않은 결과가 발생하는 현상을 말합니다.
3가지 이상 현상이 존재합니다.
🗑️ Dirty Read
레벨 0
수준에서 발생하는 이상 현상입니다. Uncommitted Dependency
라고도 불립니다.
작업이 완료되지 않은 데이터를 가져올 때 발생합니다.
Dirty Read
는 흔하게 볼 수 있는 현상입니다. 예를 들어보겠습니다.
오늘은 월급날 치킨을 FLEX 할 생각입니다. 💰 😎 💸
핫 황금 올리브를 주문을 했고, 50분 뒤에 도착할 예정이라고 알람이 왔습니다.
시간에 맞춰서 볼 유튜브를 켜놓고 아껴두었던 원소주를 꺼내놨습니다.
시간이 지나도 도착하지 않길래 혹시 해서 확인 전화를 했습니다.
뭐..? 주문이 취소되었어..😱?
이렇게 확정되지 않은 데이터를 가져옴으로 예기치 못한 상황이 발생할 수 있습니다.
🔁 Non-Repeatable Read
레벨 0
, 레벨 1
수준에서 발생하는 이상 현상입니다. Inconsistent Analysis
라고도 불립니다.
중간에 커밋된 데이터를 가져와 한 트랜잭션 내에서 SELECT에 대해서 다른 결과물을 가져올 때 발생합니다.
이름 그대로 읽기(Read) 반복 작업에 대해서 신뢰성이 없는 것을 의미합니다.
이번에도 비슷하게 Non-Repeatable Read
예시를 들어보겠습니다.
오늘 퇴근 후 지친 심신을 달래기 위해서 저녁은 치킨을 영접할 생각입니다. 🍗
경건한 마음으로 장바구니에 담았습니다. 이제 결제 페이지로 넘어가 결제만 하면 됩니다.
근데 갑자기 재고가 없어서 주문을 할 수 없다고 합니다.아니 그러면 결제 페이지로 넘어가지 말지!
이렇게 작업이 이루어지고 있는 동안 데이터가 변경되어 다시 확인했을 때 다른 결과가 나오는 현상을 의미합니다.
👻 Phantom Read
레벨 0
, 레벨 1
, 레벨 2
수준에서 발생하는 이상 현상입니다.
트랜잭션
내에 작성하거나 삭제하지 않은 데이터가 유령처럼 등장할 때를 의미합니다.
마지막 Phantom Read
의 가벼운 예시입니다.
무더운 날 몸 보신할 겸 치킨을 주문하려고 합니다.
근데 오늘따라 입맛을 살려줄 핫황올이 너무나도 땡깁니다.
장바구니에 담고 결제를 하려고 보니 갑자기 텅 비어있습니다.아니 뭔데?
아마 중간 매장에서 핫황올
이라는 메뉴를 삭제한 것 같습니다. 🥹
그 결과 우리는 추가한 데이터가 없는 데이터(유령 데이터)가 되었습니다.
이렇게 한 작업 내에서 추가 정보가 생기거나 정보가 삭제되는 현상을 의미합니다.
🧐 무엇을 고려할까요?
높은 수준이 꼭 좋은 것만은 아니고 낮은 수준이 꼭 나쁜 것만은 아닙니다.
낮은 수준은 빠르고 높은 수준은 안전합니다. 여기서 알아야 할 개념이 있습니다.
- 동시성 (Concurrency) : 빠르게 처리할 수 있는 양
- 일관성 (Consistency) : 데이터가 안전한 정도
동시성과 일관성은 서로 반비례 관계에 있습니다.
따라서, 데이터의 중요도와 처리량을 고려해서 설정하는 것이 중요합니다. 😋😋
😎 정리
트랜잭션
은 하나의 작업 단위이다.트랜잭션
은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 |
댓글