격리레벨(DB 트랜잭션 모델)

유수민·2022년 7월 11일
0

지식창고

목록 보기
20/64

📌1. READ UNCOMMITTED - Level 0

  • lock을 전혀 사용하지 않는다.
  • 이 레벨의 경우 트랜젝션을 사용하는 의미 자체가 거의 없어 잘 사용되지 않는다.
  • SELECT 쿼리 실행 시, 다른 트랜잭션에서 COMMIT 되지 않은 데이터(dirty read)를 읽어올 수 있다.

📌2. READ COMMITTED - Level 1

  • COMMIT이 완료된 데이터만 SELECT로 조회 가능하다.
  • 대부분의 DBMS에서 기본으로 설정한다.
  • READ UNCOMMITTED에서 발생했던 dirty read가 발생하지 않도록 보장해준다.
  • Read Committed의 문제는 하나의 트랜잭션 안에서 SELECT를 수행 할 때마다 데이터가 동일하다는 보장을 해주지 않는다는 것이다.
    즉, SELECT가 발생할 때마다 새로운 스냅샷을 생성해서 읽어오므로 phantom read(유령 읽기)가 발생할 수 있다. 유령읽기의 발생 이유는 다른 트랜젝션에서 해당 데이터를 COMMIT 했을 경우에는 COMMIT된 데이터를 반환해주는게 Read Committed의 특징때문이다.

💡 phantom read란

다른 세션에서 insert를 했거나 delete를 했거나 해서 자신의 세션에서 조회한 자료세트 범위가 다른 세션에 의해서 변경될 경우, 자신의 자료 세트를 자신이 변경하지 않았음에도 불구하고 유령처럼 바뀌는 것을 의미한다.

📌3. REPEATABLE READ - Level 2

  • Inno DB에서 별다른 설정을 하지 않으면 REPEATABLE READ가 기본 level로 설정된다. 즉, MySQL의 디폴트 값이다.
  • locking을 이용하지 않는 consistent read 방식을 사용
  • 명시적으로 locking read를 할 수 있도록 ( SELECT ... FOR SHARE , SELECT ... FOR UPDATE ) 구문을 제공한다.
  • 매번 새로운 스냅샷을 생성하지 않고 특정 시점의 스냅샷을 이용하여 기존과 동일한 결과를 리턴할 수 있도록 해주는 isolate level이 REPEATABLE READ이다.

💡 consistent read이란

트랜잭션 내부에서 non-locking read(기본 SELECT 구문) 실행할 때, 동시에 실행중인 다른 트랜잭션에서 데이터를 변경하더라도 특정 시점의 스냅샷(snapshot)을 이용하여 기존과 동일한 결과를 리턴할 수 있도록 해주는 기능이다. MVCC (Multi Version Concurrency Control)의 한 방식이다.
Lock을 사용하지 않고 스냅샷을 기반으로 동작하기 때문에 동시성이 높다

📌4. SERIALIZABLE - Level 3

모든 작업을 하나의 트랜잭션에서 처리하는 것과 같은 가장 높은 고립수준을 제공한다. 읽을 row에 미리 lock을 걸고 읽는 것이다. 해당 lock이 풀릴 때까지 대기하고 lock이 풀려야 값을 읽을 수 있다.

  • lock을 많이 써서 데드락 발생 확률이 높다.
  • 병렬성 향상

📌READ-COMMITED, REPEATABLE-READ이 어떤 차이가 있지?

📖공통점

번거로움과 리스크를 감수하더라고 성능이 필요할 때 사용한다.

📖차이 1. 스냅샷

Read Committed: 커밋된 아이템을 읽을 수 있는 모드, 같은 트랜잭션에서는 최근의 스냅샷을 읽는다.

Repeatable Read: 첫 번째 읽기에 스냅샷을 생성. 이후 동일 트랜잭션에서는 스냅샷부터 값을 읽는다.

📖차이 2. 동일한 값 보장 유무

Read Committed는 하나의 트랜잭션에서 같은 쿼리를 두번 실행하여 데이터를 조회할때 값이 달라질 수 있다. 커밋된 정보를 어떤 제약 없이 읽을 수 있기 때문에 여러 스냅샷 버전으로 읽는 것이 가능하다.
→ Repeatable

Repeatable Read는 하나의 트랜잭션 안에서 하나의 스냅샷 버전으로만 동작하기 때문에 같은 쿼리를 두번 실행하다 할지라도 동일한 값이 유지된다.
→ Non Repeatable

📌정리

💡

  • Read uncommited
    커밋되지 않은 읽기,dirty read, 현재 값을 무조건 읽음
  • Read committed
    커밋된 읽기, commit되지 않은 값에 대해서는 이전 버전의 값을 읽음
  • Repeatable read
    반복 가능한 읽기, 트랜잭션이 읽어가는 데이터에 대해 잠금 수행하고 그 Tx이 Commit되기 전까지 다른 트랜잭션의 변경연산금지
  • Serializable
    직렬가능, 유령문제를 방지하며 독립성을 보장
profile
배우는 것이 즐겁다!

0개의 댓글