트랜잭션의 특성(ACID)
- 원자성(Atomicity) : 작업이 모두 반영(Commit)되거나, 전혀 반영되지 않아야(Rollback) 한다.
- 일관성(Consistency) : 작업 처리 결과는 항상 일관되게 유지되어야 한다.
- 독립성(Isolation) : 각각의 트랜잭션은 서로 독립적으로 동작하고 영향을 주지 않아야 한다.
- 영속성(Durability) : 트랜잭션이 완료된 이후에는 영구적으로 반영되어야 한다. 실패하여도 그 상태가 일관되게 유지되어야 한다.
격리성 관련 문제
Dirty Read
트랜잭션 A가 데이터에 접근하여 값을 'A'에서 'B'로 변경했고 아직 커밋을 하지 않았을때, 트랜잭션 B가 해당 데이타를 Read 하면 읽은 데이터는 B가 될 것이다. 하지만 트랜잭션 A가 최종 커밋을 하지 않고 롤백하였다면 트랜잭션 B는 무결성이 깨진 데이터를 사용할 것이다.
Non-Repeatable Read
트랜잭션 A가 데이타를 Read 하고 있을 때 트랜잭션 B가 데이터에 접근하여 값을 변경하거나 삭제하고 커밋을 실행한다. 그 후 트랜잭션 A가 다시 해당 데이터를 Read하고자 하면 변경된 데이터 혹은 사라진 데이터를 찾게 된다.
Phantom Read
트랜잭션 A가 특정 조건으로 데이터를 검색하여 결과를 얻었을 때 트랜잭션 B가 접근하여 해당 조건의 데이터 일부를 삭제 또는 추가했다. 이 때 아직 끝나지 않은 트랜잭션 A가 다시 한번 해당 조건으로 데이터를 조회하면 트랜잭션 B에서 추가/삭제된 데이터가 함께 조회/누락 된다.
트랜잭션 격리 수준
여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 격리 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITTED가 있다.

SERIALIZABLE
가장 엄격한 격리 수준이다. 트랜잭션이 읽은 데이터를 다른 트랜잭션이 갱신, 삭제, 삽입할 수 없다. 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다.
발생 문제점 : 없음
REPEATABLE READ
트랜잭션이 읽은 데이터를 다른 트랜잭션이 갱신, 삭제할 수 없다. 삽입을 막지 않기 때문에 조회시 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견될 수 있다.
발생 문제점 : Phantom Read
READ COMMITTED
COMMIT된 데이터만 다른 트랜잭션이 조회할 수 있다. 가장 일반적으로 선택되는 격리 수준이다.
발생 문제점 : Non-Repeatable Read, Phantom Read
READ UNCOMMITTED
COMMIT 여부와 상관없이 다른 트랜잭션이 데이터를 조회할 수 있다. 동시성은 높지만 데이터의 일관성을 유지하기 어렵다.
발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read
참고 자료
https://incheol-jung.gitbook.io/docs/q-and-a/db/isolation-level