트랜잭션이란?
트랜잭션(Transaction 이하 트랜잭션)이란,
데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 뜻한다.
데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일까?
간단하게 말해서 아래의 질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것을 의미한다
- 논리적인 작업 단위 (a single logical unit of work)
- 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나누어질 수 없도록 만든 것
- 트랜잭션 내 SQL 문들은 모두 성공하는 경우 commit되고, 하나라도 실패하는 경우에는 전체가 rollback 된다.
- 트랜잭션 내 SQL 문 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.

트랜젝션이 왜 필요할까?
예를 들면, A 은행 → B은행으로 돈을 보내기 위하여 출금하고 송금한다고 가정해보자
A은행에서 돈을 출금하고나서 B은행으로 송금하려고 하는데 갑자기 시스템이 멈추면 어떻게 될까?
돈은 출금되었지만, 송금되지 않고 증발하게 되는 끔찍한 상황이 발생한다.
트랜젝션은 이런 상황이 일어나지 않도록 보장해준다.
대부분의 데이터베이스는 송금이 되다가 마는 상황이 발생하지 않도록 여러가지 방법을 제공하지만,
공통적으로 제공하는 가장 기본적인 방법은
Transaction을 통하여 데이터의 유효성을 보장하는 것이다
트랜잭션 ACID란?
ACID는 무슨 뜻일까요? 산인가요?

ACID는 데이터의 유효성을 보장하기 위한, 트랜젝션의 특징들의 앞글자를 딴 단어이다.
- 트랜잭션이 어떤 속성을 지녀야 하는지 나타내는 핵심
- 트랜잭션은 ACID라 규칙을 모두 보장해 데이터베이스 트랜잭션이 안전하게 수행되어야 한다.
- 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 앞글자를 딴 규칙
Atomicity(원자성)
모든 작업이 반영되거나 모두 롤백되는 특성이다.
Consistency(일관성)
데이터는 미리 정의된 규칙에서만 수정이 가능한 틍성을 의미한다.
Isolation(고립성)
A와 B 두개의 트랜잭션이 실행되고 있을때, A의 작업들이 B에게 보여지는 정도를 의미한다.
Durability(영구성)
한번 반영(커밋)된 트랜젝션의 내용은 영원히 적용되는 특성을 의미한다.

MySQL의 트랜잭션 격리 수준(Isolation Level)
MySQL은 아래 4단계의 트랜잭션 격리 수준을 지원한다.
아래로 갈수록 격리 레벨이 높아진다.
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
1. READ UNCOMMITTED
커밋하지 않은 데이터조차도 접근할수 있는 격리 수준.
트랜잭션의 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 Dirty Read(오손 읽기)가 발생한다.
예를 들어 문제가 생겨 INSERT 한 데이터를 ROLLBACK 할지도 모르는 상태인데도 해당 레코드 조회가 가능하다.
당연하게도 심각한 정합성 문제가 발생하기 때문에 일반적으로 사용하지 않는다.
정합성(Consistency)은 데이터나 정보가 논리적으로 모순 없이 일관되게 일치하는 상태
2. READ COMMITTED
커밋이 완료된 데이터만 조회
다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라지는 Non-Repeatable Read(반복 읽기 불가능)이 발생한다.
예를 들어 트랜잭션 A와 B가 있다고 해보자.
먼저 트랜잭션 A가 시작되었다. A는 특정 레코드를 조회하고 a라는 결과를 받았다.
그리고 트랜잭션 A가 종료되기 전, 트랜잭션 B가 실행되었고 레코드의 값을 b로 바꾼 뒤 종료되었다.
이때 트랜잭션 A가 다시 레코드를 조회하면 b라는 결과를 받게 된다.
Non-Repeatable Read(반복 읽기 불가능)란
트랜잭션 내에서는 시작할 당시의 정보를 유지(Repeatable Read : SELECT 쿼리는 동일한 결과를 리턴)해야 하는데,
READ COMMITTED 에서는 이를 보장하지 못한다는 겁니다.
READ COMMITTED 는 Oracle에서 기본 수준으로 채택하고 있다
(Lock을 사용하지 않고 쿼리시작 시점의 Undo 데이터를 제공하는 방식으로 구현)
3. REPEATABLE READ
한번 조회한 데이터는 트랜잭션 내에서 다시 조회해도 같은 데이터가 나오는게 보장.
하지만 새로운 레코드의 추가 자체는 막는것이 아니기에 Phantom Read(유령 읽기: 결과 집합이 변함)가
발생할 수 있습니다. MySQL, InnoDB에서 기본 수준으로 채택하고 있습니다.
Dirty Read와Phantom Read의 차이
- Dirty Read : 더티 리드는 트랜잭션으로 아직 존재할 수 없는 데이터가 조회되는 것을 말한다.
- Phantom Read : 존재할 수 있는 데이터긴 하나 해당 트랜잭션의 시점이 아닌 것을 말한다
4. SERIALIZABLE
모든 트랜잭션을 순차적으로 처리.
때문에 동시처리 성능이 매우 떨어진다.
여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로 어떠한 데이터 부정합 문제도 발생하지 않습니다.
순수한 SELECT 작업도 대상 레코드에 Next Key Lock을 읽기 잠금으로 걸기 때문에
해당 레코드를 다른 트랜잭션에서는 절대 추가/수정/삭제 할 수 없도록 합니다.
'CS' 카테고리의 다른 글
| [CS] - 정규화(Normalization), 역정규화(DeNormalization) (0) | 2026.01.01 |
|---|---|
| [CS] - MVCC(다중 버전 동시성 제어) (0) | 2025.12.30 |
| [CS] - Race condition(경쟁 상태) (0) | 2025.12.28 |
| [CS] - 동시성(Concurrency) VS 병렬성(Parallelism) (0) | 2025.12.28 |
| [CS] - 운영체제의 CPU 스케줄링 (0) | 2025.12.27 |