ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션 격리 수준(Isolation Level)
    CS/데이터베이스 2021. 12. 13. 18:14

    격리 수준(Isolation Level)이란 무엇일까?

    동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정하는 것

     

    4가지의 Level로 구분됩니다

    READ UNCOMMITTED

    COMMIT 되지 않은 데이터를 읽을 수 있다.

     

    READ COMMITTED

    COMMITTED된 데이터만 읽을 수 있다.

     

    REPETABLE READ

    COMMITTED 된 데이터만 읽을 수 있다.

    어떤 데이터를 읽는 도중 변경이 허용되지 않는다.

     

    SERIALIZABLE

    COMMITTED 된 데이터만 읽을 수 있다.

    어떤 데이터를 읽는 도중 변경(Update)이 허용되지 않는다.

    어떤 데이터를 읽는 도중 삭제(Delete)나 추가(Insert)를 허용하지 않는다.

     

    격리 수준 Level

    Dirty Read, Non-repetable Read, Phantom Read는 무엇일까요?

    아래와 같은 Users Table을 가지고 있다고 가정하겠습니다.

     

    Dirty Read

    트랜잭션이 COMMITTED 되지 않은 값을 읽어옵니다.

    Dirty Read

    3. T1에서 id=1인 row의 age를 불러옵니다. ( age = 20)

    2. T2는 id=1인 row의 age를 21로 Update 합니다. (Commit은 되지 않았습니다.)

    3. T1에서 id=1인 row의 age를 불러옵니다. ( age = 21)

    4. T2에 ROLLBACK이 일어납니다.

     

    T2에 ROLLBACK이 일어난다면 T1이 의미 없어진 T2의 트랜잭션(Update)의 영향을 받을 수 있다.

     

    READ UNCOMITTED 격리 수준에서 발생하며 격리 수준이 READ COMITTED가 된다면 막을 수 있다.

     

    Non-repetable Read

    트랜잭션이 어떤 데이터를 읽는 도중 변경이 되는 경우

    Non-repetable Read

    1. T1에서 id=1인 row의 age를 불러옵니다. (age = 20)

    2. T2는 id=1인 row의 age를 21로 Update 합니다. (Commit 되었습니다.)

    3. T1에서 id=1인 row의 age를 불러옵니다. (age = 21)

     

    3번째에서는 Update 된 21값이 불러와지는데 T1은 사실 20의 값을 원한 것일 수 있다.

     

    READ COMITTED 격리 수준에서 발생하며 격리 수준이 REPETABLE READ가 된다면 막을 수 있다.

     

    Phantom Read

    트랜잭션이 수행되는 중 새로운 데이터가 INSERT 되는 경우

    Phantom Read

    1. Users table에서 age가 10~30 사이의 row를 모두 출력한다. (1, 'Joe', 20), (2, 'Jill', 25)

    2. Users table에 (3, 'Bob', 27)이라는 데이터가 추가된 후 Commit 됩니다.

    3. Users table에서 age가 10~30 사이의 row를 모두 출력한다. (1, 'Joe', 20), (2, 'Jill', 25), (3, 'Bob', 27)

     

    T1은 예상하지 못했던 새로운 행을 보게 됩니다. ( 적절할 수 도 있고 아닐 수도 있다.)

     

    REPETABLE READ 격리 수준에서 발생하며 격리 수준이 Serializable이 된다면 막을 수 있다.

    댓글

Designed by Tistory.