Skip to Content
Suffering builds character

10. 격리 수준

1. Isolation Level, 격리 수준

격리 수준이란 Read phenomena와 같은 예상하지 않은 결과, 동작을 해결하기 위해 필요한 개념으로,

격리 레벨의 기본 값은 DBMS 별로 서로 다른 수준으로 지정되어 있으며, 격리 수준을 개발자가 직접 변경할 수 있음

MySQL의 기본 격리 수준은 Repetable Read
Oracle의 기본 격리 수준은 Read Committed

isolation_level Image Ref.

1-1. Read Uncommitted

Dirty read가 발생할 수 있는 격리 수준

즉, 아직 다른 트랜잭션에서 Commit 되지 않은 레코드도 조회가 가능한 레벨

1-2. Read Committed

대부분의 서비스에서 사용하는 격리 수준

다른 트랜잭션에서 Commit된 결과만 조회가 가능한 레벨,

Dirty read는 발생하지 않게 되지만, Non-repetable reads 는 발생할 수 있음

1-3. Repeatable Read

MySQL의 InnoDB엔진에 기본으로 적용된 격리 수준

하나의 트랜잭션에서 동일한 쿼리를 조회해도 반복적으로 동일한 레코드로 조회 가능

Dirty readNon-repetable reads 모두 발생하지 않음

개념적으로는 예외적으로 Phantom reads는 발생할 수 있으나,
InnoDB 엔진에서는 락(Lock)과 MVCC(Multi Version Concurrency Control) 메커니즘을 통해 Repetable Read 수준에서도 Phantom reads가 거의 발생하지 않도록 적용되어 있음

1-4. Serializable

가장 엄격한 격리 수준

InnoDB 엔진은 기본적으로 SELECT 수행 시 어떠한 레코드도 잠금(Lock)처리를 하지 않고 수행됨(Non-locking consistent read),

하지만 격리 수준이 Serializable로 격상될 경우,
SELECT로 조회한 레코드 역시 잠금이 적용되어 현재 조회 중인 레코드에 다른 트랜잭션은 절대 접근할 수 없게 됨

따라서 Phantom reads도 발생하지 않음

단점으로는 격리 수준이 올라간만큼 동시 처리 성능은 떨어짐

→ 격리 수준과 동시 처리 성능은 trade-off 관계

concurrency_consistency

Last updated on