트랜잭션이란?
데이터베이스에서 논리적 기능을 수행하기 위한 작업의 최소 단위
여러 쿼리를 묶어 하나처럼 처리
트랜잭션 ACID 속성
원자성(Atomicity)
트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야 한다 (하나의 작업처럼 처리)
모두 성공 시 커밋, 하나라도 실패 시 롤백
일관성(Consistency)
모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다
- 트랜잭션이 진행되는 중간에 데이터베이스가 변경되더라도 변경된 데이터베이스로 트랜잭션이 진행되는게 아니라 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행됨
- → 사용자는 일관성 있는 데이터를 볼 수 있게 됨
격리성(Isolation)
동시에 실행되는 동작들이 서로에게 영향을 미치지 않도록 격리해야 한다
- ex. 동시에 같은 데이터를 수정할 수 없어야 함
영속성(Durability)
트랜잭션을 성공적으로 끝내면 그 결과는 영구적으로 반영되어야 한다
트랜잭션 동작 원리

DB Connection
사용자는 WAS, DB 접근 툴 등의 클라이언트를 사용해서 데이터베이스 서버에 연결을 요청하고 커넥션을 맺어 DB 서버에 접근할 수 있다.
이때 데이터베이스 서버는 내부에 세션을 만들어 이 세션을 통해 커넥션을 통한 요청을 실행하게 된다.
하나의 세션 내 동작
트랜잭션은 하나의 세션 내에서 동작한다. (커밋 또는 롤백 → 세션 종료)
트랜잭션 동작 과정
데이터베이스는 기본적으로 auto commit 설정이 되어있음. 각 명령어마다 DB에서 자동으로 커밋을 해주는 셈.
트랜잭션은 하나의 논리 단위로 묶이는 작업들을 즉각적으로 반영되지 않도록 하는 것이기 때문에, 이 자동커밋을 해제하고 수동커밋 모드로 변경한다.
트랜잭션 성공 시 >
트랜잭션 실패 시 >
커밋과 롤백
Commit
모든 작업들을 정상 처리하겠다고 확정하는 명령어. 수행 시 하나의 트랜잭션 과정이 종료되며, 해당 처리들을 DB에 영구 저장하게 됨
Rollback
작업 중 문제가 발생한 경우 트랜잭션 처리 과정에서 발생한 변경사항을 취소하는 명령어. 수행 시 트랜잭션을 시작하기 이전 상태로 되돌아감 (예전에 커밋으로 저장한 상태로 복구되는 것)
- ‼️ DDL문(CREATE, DROP, ALTER, TRUNCATE)은 트랜잭션의 롤백 명령이 적용되지 않는다
MySQL의 트랜잭션
- 스토리지엔진대표적인 엔진으로 MyISAM과 InnoDB가 있는데, 트랜잭션 기능을 사용하려면 InnoDB를 써야 한다.
- 스토리지엔진에 따라 트랜잭션 지원 여부와 동작 방식(락 방식, 외래키 지원 여부, 동시성 처리율, 충돌 후 복구 가능성 등)이 달라진다.
트랜잭션 격리 수준 4단계
여러 트랜잭션이 동시에 처리될 떄, 특정 트랜잭션이 다른 트랜잭션의 변경 데이터를 어디까지 읽을 수 있게 할 것인가를 정의
| 격리 수준 | Dirty Read | Non-repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 발생 | 발생 | 발생 |
| READ COMMITTED | 해결 | 발생 | 발생 |
| REPEATABLE READ | 해결 | 해결 | 발생 (InnoDB는 대부분 해결) |
| SERIABLIZABLE | 해결 | 해결 | 해결 |
격리 수준이 가장 낮은 단계 부터 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIABLIZABLE
READ UNCOMMITTED
가장 낮은 격리 수준. “커밋되지 않는 데이터도 읽는다” → Dirty Read 발생
실무에서 거의 사용하지 않음
READ COMMITTED
“커밋된 데이터만 읽는다” → Dirty Read는 막을 수 있지만 Non-repeatable Read는 발생할 수 있다.
REPEATABLE READ
“같은 트랜잭션에서는 항상 동일한 결과를 읽는다” → ****Non-repeatable Read를 방지,
SQL 표준 - Phantom Read 발생
MySQL InnoDB - 대부분의 경우 Phantom Read도 방지 (InnoDB의 기본 격리 수준에 해당)
Phantom Read
: 다른 트랜잭션에 의해 레코드가 추가/삭제 되는 경우에 동일 트랜잭션 내에서도 조회 결과가 달라지는 현상(없었다가 생기기도 하고 있었다가 없어지기도 해서 유령 읽기라고 한다)
MVCC
- Multi-Version Concurrency Control, 다중 버전 동시성 제어
: 변경 전의 레코드를 언두 공간에 백업해놓는 것
→ 변경 전/후의 데이터가 모두 존재. 트랜잭션이 롤백된 경우뿐 아니라 서로 다른 트랜잭션 간 접근할 수 있는 데이터를 세밀하게 제어 가능이를 통해 한 트랜잭션 내 동일한 결과를 보장한다.
- B가
SELECT FOR UPDATE로 베타적 잠금(비관적 잠금, 쓰기 잠금)을 걺 : 1건 조회 - A가 새로운 데이터를 삽입
- B가 동일한 잠금 쿼리로 다시 한 번 데이터를 조회 : 2건 조회
→ 일반적인 DBMS에는 갭락이 존재하지 않으므로 선택한 레코드만 잠금이 걸리고, 다른 트랜잭션이 새로운 레코드를 추가할 수 있다
- B가
SELECT FOR UPDATE로 id = 50인 데이터 조회
→ id = 50인 레코드에는 레코드 락, id > 50 범위에는 갭 락으로 넥스트 키 락을 건다 - A가 id = 51인 데이터를 삽입 시도
- B의 트랜잭션이 종료(커밋 또는 롤백)될 때까지 기다리다가, 대기를 지나치게 오래할 경우 락 타임아웃이 발생하게 된다.
❓ MySQL에서 Phantom Read가 발생하는 경우는 아예 없을까
ex. B가 잠금 없이 데이터 조회를 하고, A가 데이터를 추가 (바로 커밋) → B가 잠금 있는 조회 (테이블에서 조회)를 한다면 발생하겠지만, 일반적인 케이스 아님.
SERIABLIZABLE
가장 엄격한 격리 수준. “트랜잭션을 순차적으로 진행시킨다” → 여러 트랜잭션이 동일한 레코드에 동시 접근 불가
어떠한 데이터 부정합 문제도 발생하지 않지만 동시 처리 기능이 매우 떨어져 실무에서는 잘 사용하지 않는다.
참고 블로그
https://stonehee99.tistory.com/33
데이터베이스 트랜잭션 완전 가이드 - 개념부터 ACID, MySQL, 격리 수준, 스프링 적용까지
트랜잭션(Transaction)은 데이터베이스의 무결성과 안정성을 지키기 위해 꼭 이해해야 하는 핵심 개념입니다.오늘은 다음 내용을 단계별로 살펴봅니다트랜잭션의 기본 개념ACID 속성이 중요한 이유
stonehee99.tistory.com
https://inpa.tistory.com/entry/MYSQL-📚-트랜잭션Transaction-이란-💯-정리
[MYSQL] 📚 트랜잭션(Transaction) 개념 & 사용 💯 완벽 정리
트랜잭션(Transaction) 이란? 트랜잭션(Transaction)의 사전적 의미는 거래이고, 컴퓨터 과학 분야에서의 트랜잭션(Transaction)은 "더이상 분할이 불가능한 업무처리의 단위"를 의미한다. 이것은 하나의
inpa.tistory.com
https://innovation123.tistory.com/61
[Database] 트랜잭션의 동작 원리와 ACID 속성
트랜잭션(Transaction)이란?트랜잭션은 하나의 데이터 교환 또는 변경을 안전하게 처리하도록 보장해 주는 것을 의미한다. 한 번의 애플리케이션 로직으로 인해 두 개 이상의 데이터가 영향을 받는
innovation123.tistory.com
https://mangkyu.tistory.com/299
[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기
이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해
mangkyu.tistory.com
'CS' 카테고리의 다른 글
| HTTP란? <핵심 요약 정리> (2) | 2024.11.21 |
|---|---|
| 브라우저 저장소의 차이점 (Local Storage, Session Storage, Cookie) - 보안성 비교 / 사용자 인증 토큰은 어디에 저장하는 것이 가장 바람직할까? (3) | 2024.11.13 |
| CSR과 SSR (8) | 2024.11.06 |
| Reflow와 Repaint 알아보기 (0) | 2024.10.15 |
| 브라우저의 렌더링 원리 (7) | 2024.10.08 |