: 동일한 트랜잭션 시나리오 (입력, 작업)에도 고립 수준에 따라 결과가 달라질 수 있음
→ ANSI/SQL 표준에서 트랜잭션 고립 수준을 4가지로 정의, 각 고립 수준에서 허용할 현상을 정함

Dirty Read(Uncommitted Dependency)
: commit되지 않은 데이터를 읽는 것
→ 데이터 무결성이 깨지고, 외래 키 제약조건이 무시되는 등 문제 발생

Non-Repeatable Read(Inconsistent Analysis)
: 기존에 읽은 row를 다시 읽을 때, 해당 row 가 없거나 변경된 경우
→ 한 트랜잭션에서 같은 row를 두 번 읽었는데 결과가 다른 경우
→ 반대 : Repeatable Read 정합성 - 트랜잭션 내에서 같은 row는 항상 같은 결과

Phantom Read
: 트랜잭션 내부에서 같은 쿼리를 두 번 실행할 때, 첫 실행 시 없던(phantom) 레코드가 조회
→ 다른 트랜잭션의 INSERT에 의해 발생, write lock설정을 통해 방지 가능
→ 같은 쿼리에 대하여 만족하는 데이터가 더 많아지기 때문에 Non-repeatable read와는 차이

→ 데이터 정합성에 문제가 발생할 수 있어서 RDBMS에서 표준 격리 수준으로 인정 X
Oracle
Dirty Read 허용 DB
non-blocking read를 제공하기 때문에 commit까지 기다릴 필요 없음
비Oracle
공유 lock을 레코드 별로 걸었다 해제했다 반복
commit 될 때까지 기다려야 함
→ 사용자가 해당 row 사용 중이라면 commit 할 때까지 기다리는 비효율
→ Update 와 Read가 충돌한 상황
멀티 버저닝을 통해 쿼리가 실행되기 시작한 시점을 기준으로 일관성 있는 결과를 보여주고, 읽는 자와 쓰는 자가 서로 Blocking하지 않도록 함
- 멀티 버저닝
- 접근한 시점에 데이터베이스의 Snapshot을 읽음
- snapshot 변경이 commit 될 때까지 다른 사용자 접근 불가
- 사용자가 업데이트하면 기존 데이터에 덮어 씌우는 것이 아닌 새로운 버전의 데이터를 UNDO영역에 생성
→ UNDO영역에 백업 데이터가 많아지면 성능 저하
- 이전 버전 데이터와 비교하면서 변경 내용 기록
- 사용자는 마지막 버전의 데이터를 읽게 됨
비Oacle
공유 읽기 Lock을 채택함으로써 구현 ⇒ 트랜잭션 단위로 lock 걸었다 해제
→ 데이터를 읽는 자가 쓰는 자 Block
트랜잭션이 해당 row를 읽기만 해도 lock
→ 동시성을 저하하고, 교착상태에 빠질 수 있음