Search
Duplicate

트랜잭션이 보장해야 하는 ACID

ACID of Transaction

원자성(Atomicity)

: 한 트랜잭션 내에서 실행한 작업들은 하나의 작업으로 간주한다. 모두 성공 아니면 실패

일관성(Consistency)

: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다.(==무결성 조건 항상 만족)

격리성(Isolation)

: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리 해야한다.

지속성(Durability)

: 트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.

격리성(Isolation) 이슈

격리성을 완전히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생합니다. 반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬처리하게 되면 데이터의 무결성이 깨질 수 있습니다.

문제점

1.
Dirty Read
⇒ 한 트랜잭션(Transacion_1)이 데이터에 접근하여 특정 값을 수정후 커밋을 하지않아 적용이 안 된 상태에서 다른 트랜잭션(Transacion_2)이 같은 데이터를 읽는다면 어떻게 될 것인가? Transacion_2 은 변경된 값으로 읽게 될 것이지만 최초의 트랜잭션(Transacion_1)이 커밋을 하지않고 종료되면 문제가 생기게 됩니다.
2.
Non-Repeatable Read
⇒ 한 트랜잭션(Transacion_1)이 특정 데이터를 조회하여 로직을 수행하는 와중에 다른 트랜잭션(Transacion_2)이 해당 데이터를 삭제&변경하게 되면 기존의 트랜잭션(Transacion_1)이 로직 수행중 다시 특정 데이터를 조회하게 되면 변경되었거나 삭제된 데이터를 찾게 됩니다.
3.
Phantom Read
⇒ 위 2번 Non-Repeatable Read 상태에서 특정 데이터를 변경&삭제한 트랜잭션(Transacion_2)에서 롤백을 해버리면 기존 트랜잭션(Transacion_1)의 데이터는 꼬여버린다.

트랜잭션 격리 수준

: 트랜잭션의 격리성 이슈들로 인해 ANSI표준에서는 트랜잭션의 격리성과 동시 처리 성능 사이의 Trade-off를 두고 4단계 격리수준을 나눴습니다.
격리수준을 높힐수록 이슈들은 적게 발생하지만 동시 처리 성능은 떨어집니다.
참고: 트랜잭션 발생시 락(Lock)이 걸리는데, SELECT 시에는 공유 락, CREATE / INSERT / DELETE 시에는 배타적 락이 걸립니다.

1. Read Uncommitted

⇒ 한 트랜잭션에서 커밋하지 않은 데이터에 다른 트랜잭션이 접근 가능합니다. 즉, 커밋하지 않은 데이터를 읽을 수 있습니다.
이 수준은 트랜잭션의 모든 격리성 이슈가 발생할 수 있지만, 동시 처리 성능은 가장 높습니다. - 발생 이슈: Dirty Read , Non-Repeatable Read, Phantom Read

2. Read Committed

⇒ 커밋이 완료된 데이터만 읽을 수 있습니다.
Dirty Read가 발생할 여지는 없으나, Read Uncommitted수준보다 동시 처리 성능이 떨어집니다. DB에서는 보통 Read Committed를 기본으로 설정합니다. - 발생 이슈: Non-Repeatable Read, Phantom Read

3. Repeatable Read

⇒ 트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회 됩니다.
개별 데이터 이슈(Dirty Read , Non-Repeatable Read)는 발생하지 않지만, 결과 집합 자체가 달라지는 Phantom Read는 발생 가능합니다. -발생 이슈: Phantom Read

4. Serializable

⇒ 가장 엄격한 격리 수준
위 3가지 문제를 모두 커버 가능하지만 성능이 가장 떨어집니다.