트랜잭션은 하나의 작업 단위를 묶은 것으로
이 안에 있는 여러 작업은 모두 성공하거나 하나라도 실패하면
전부 실패한 것으로 처리한다.

● 예를 들어 A가 B에게 10000원을 계좌 이체 한다고 할 때 A의 잔고는 10000원 감소하고 B의 잔고는 10000원 증가해야 한다.
● 계좌 이체는 이렇게 2가지 작업이 하나의 작업처럼 동작해야 한다.
● 두 작업 중 하나만 성공하면 심각한 문제가 발생된다.
● 트랜잭션을 사용하면 두 작업 다 성공해야 저장하고, 하나라도 실패하면 이전 상태로 돌아갈 수 있다.
● 모든 작업이 성공해서 데이터베이스에 정상 반영되는 것을 Commit이라 한다
● 작업 중 하나라도 실패해서 이전으로 되돌리는 것을 Rollback이라 한다.
트랜잭션의 특성 ACID
Atomicity 원자성
● 트랜잭션 안의 작업은 모두 실행되거나 아무것도 실행되지 않아야 한다.
● A가 B에게 10000원을 계좌이체 한다고 할 때 A의 잔고는 10000원 감소하고 B의 잔고는 10000원 증가해야 한다.
● 이 중 하나라도 실패하면 전체 작업이 Rollback 되어야 한다
Consistency 일관성
● 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다.
● 트랜잭션이 수행된 후에도 데이터가 제약 조건을 반드시 만족해야 한다.
● ex) NOT NULL, UNIQUE, Foreign Key 등등
Isolation 격리성
● 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.
● 예를 들면 두 사용자가 동시에 같은 상품의 재고를 업데이트하는 경우, 한 트랜잭션이 끝나기 전까지 다른 트랜잭션이 그 데이터를 수정 하는 것을 막아야 한다.
● 격리성을 너무 완벽하게 보장하면 트랜잭션을 순차적으로 실행해야한다.
● 이렇게 할 경우 동시 처리 성능이 매우 안 좋아진다.
● 이런 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의했다.
- READ UNCOMMITED (커밋되지 않은 읽기)
- READ COMMITTED (커밋된 읽기)
- REPEATABLE READ (반복 가능한 읽기)
- SERIALIZABLE (직렬화 가능)
높은 격리 수준일수록 트랜잭션 간 간섭을 강하게 차단하여 일관성은 향상된다.
사용하는 메커니즘에 따라 MVCC 또는 락 기반이 되며, 일부 수준에서는 락으로 인한 성능 저하가 발생할 수 있다.
예를 들어, REPEATABLE READ는 대부분 MVCC로 처리되기 때문에 성능이 뛰어난 반면, SERIALIZABLE은 읽기조차 락을 걸어야 해서 동시성이 크게 떨어질 수 있다.
MVCC 이해하기
MVCC 깊게 이해하기: Undo Log 기반 다중 버전 동시 제어의 원리
InnoDB 스토리지 엔진을 사용하는 mysql 기준으로 정리한다. MVCC (Multi Version Concurrency Control) 여러 트랜잭션이 동시에 같은 데이터를 조회하거나 수정할 때 서로 간섭하지 않고도 일관된 데이터를 읽
cactuslog.tistory.com
Isolation Level 이해하기
Isolation Level - 트랜잭션 격리 수준 깊게 이해하기
InnoDB 스토리지 엔진을 사용하는 mysql 기준으로 정리한다. 먼저 MVCC와 undo log, read view에 대한 이해가 필요하다. MVCC 깊게 이해하기: Undo Log 기반 다중 버전 동시 제어의 원리InnoDB 스토리지 엔진을
cactuslog.tistory.com
Durability 지속성
● 트랜잭션이 성공적으로 Commit되면 그 결과는 시스템이 꺼져도 영구적으로 보존되어야 한다.
● 중간에 시스템이 문제가 생겼다해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
'database' 카테고리의 다른 글
| Isolation Level - 트랜잭션 격리 수준 깊게 이해하기 (1) | 2025.04.12 |
|---|---|
| MVCC 깊게 이해하기: Undo Log 기반 다중 버전 동시 제어의 원리 (0) | 2025.03.29 |
| ubuntu에 mysql 설치하기 (0) | 2024.11.18 |
| MySQL Error [1248]: Every derived table must have its own alias (0) | 2024.03.16 |
| MySQL Error [1093]: You can't specify target table 테이블명 for update in FROM clause (0) | 2024.03.16 |