트랜잭션
- DBMS에서 데이터를 다루는 논리적인 작업의 단위
- 장애가 일어날 때 데이터를 복구하는 작업의 단위
- 여러 작업이 동시에 같은 데이터를 다룰 때, 이 작업을 서로 분리하는 단위
- 트랜잭션의 신뢰성을 위해 ACID 성질을 따름
ACID
Atomicity
- all or nothing → 전부 수행되거나 아예 수행되지 않아야 함
- 트랜잭션은 더 이상 쪼개지지 않는 하나의 단위임
- 트랜잭션이 실패하면 그동안의 모든 변경 사항이 롤백되어 DB 는 이전 상태로 돌아가야 함
Consistency
- 트랜잭션이 성공적으로 완료된 후에도 DB 가 일관된 상태를 유지해야 함
- 트랜잭션 전후의 DB 는 모든 규칙과 제약을 만족해야 함

Isolation
- 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 독립적으로 실행되는 것처럼 보여야 함
- 다른 트랜잭션의 중간 상태를 볼 수 없음
- 트랜잭션 간섭이 없어야 함
- Isolation Levels
- Read Uncommitted : 커밋되지 않은 데이터 읽을 수 있음
- Read Committed : 커밋된 데이터 읽을 수 있음
- Repeatable Read : 같은 트랜잭션 내에서 읽은 데이터는 항상 동일하게 유지됨. 그러나 Phantom Read 발생 가능
- Serializable : 가장 높은 고립성, 데이터 일관성이 가장 잘 보장됨
Durability
- 트랜잭션이 성공적으로 완료되면, 시스템 장애가 발생하더라도 그 결과는 영구적으로 저장되어야 함
Concurrency
- 여러 트랜잭션이 동시에 DB에 접근해 작업을 수행하는 것
- Concurrency Control 은 동시에 실행되는 트랜잭션이 서로 충돌하지 않게 하는 매커니즘
Problem
-
Dirty Read

- 한 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽는 상황
- ex) 트랜잭션 A 가 데이터를 수정했지만 아직 커밋하지 않았을 때, 트랜잭션 B가 이 데이터를 읽으면, 트랜잭션 A 가 롤백된 경우 트랜잭션 B는 잘못된 데이터를 읽게 됨
-
Non-repetable Read

- 한 트랜잭션이 같은 데이터를 여러 번 읽었을 때, 다른 트랜잭션에 의해 중간에 그 데이터가 변경되어 읽은 값이 달라짐
- ex) 트랜잭션 A가 처음 읽은 데이터가, 트랜잭션 B에 의해 수정된 후 다시 읽었을 때 값이 달라짐
-
Phantom Read

- 한 트랜잭션이 특정 조건에 맞는 데이터를 읽었는데, 다른 트랜잭션이 중간에 데이터를 삽입하거나 삭제하여, 다시 읽을 때 결과가 달라지는 상황
- MySQL 은 트랜잭션이 어떤 데이터를 읽을 때 스냅샷 형태로 데이터를 읽는 시점의 데이터를 기록하기 때문에, Phantom Read 는 발생하지 않음
- ex) 트랜잭션 A가 특정 조건의 데이터를 읽었는데, 트랜잭션 B가 해당 조건에 맞는 새로운 데이터를 삽입하면, 트랜잭션 A가 같은 조건으로 다시 조회했을 때 다른 결과를 얻게 됨