💡 phantom read란
다른 세션에서 insert를 했거나 delete를 했거나 해서 자신의 세션에서 조회한 자료세트 범위가 다른 세션에 의해서 변경될 경우, 자신의 자료 세트를 자신이 변경하지 않았음에도 불구하고 유령처럼 바뀌는 것을 의미한다.
💡 consistent read이란
트랜잭션 내부에서 non-locking read(기본 SELECT 구문) 실행할 때, 동시에 실행중인 다른 트랜잭션에서 데이터를 변경하더라도 특정 시점의 스냅샷(snapshot)을 이용하여 기존과 동일한 결과를 리턴할 수 있도록 해주는 기능이다. MVCC (Multi Version Concurrency Control)의 한 방식이다.
Lock을 사용하지 않고 스냅샷을 기반으로 동작하기 때문에 동시성이 높다
모든 작업을 하나의 트랜잭션에서 처리하는 것과 같은 가장 높은 고립수준을 제공한다. 읽을 row에 미리 lock을 걸고 읽는 것이다. 해당 lock이 풀릴 때까지 대기하고 lock이 풀려야 값을 읽을 수 있다.
번거로움과 리스크를 감수하더라고 성능이 필요할 때 사용한다.
Read Committed: 커밋된 아이템을 읽을 수 있는 모드, 같은 트랜잭션에서는 최근의 스냅샷을 읽는다.
Repeatable Read: 첫 번째 읽기에 스냅샷을 생성. 이후 동일 트랜잭션에서는 스냅샷부터 값을 읽는다.
Read Committed는 하나의 트랜잭션에서 같은 쿼리를 두번 실행하여 데이터를 조회할때 값이 달라질 수 있다. 커밋된 정보를 어떤 제약 없이 읽을 수 있기 때문에 여러 스냅샷 버전으로 읽는 것이 가능하다.
→ Repeatable
Repeatable Read는 하나의 트랜잭션 안에서 하나의 스냅샷 버전으로만 동작하기 때문에 같은 쿼리를 두번 실행하다 할지라도 동일한 값이 유지된다.
→ Non Repeatable
💡
- Read uncommited
커밋되지 않은 읽기,dirty read, 현재 값을 무조건 읽음- Read committed
커밋된 읽기, commit되지 않은 값에 대해서는 이전 버전의 값을 읽음- Repeatable read
반복 가능한 읽기, 트랜잭션이 읽어가는 데이터에 대해 잠금 수행하고 그 Tx이 Commit되기 전까지 다른 트랜잭션의 변경연산금지- Serializable
직렬가능, 유령문제를 방지하며 독립성을 보장