CS/데이터베이스

트랜잭션 격리 수준(Isolation Level)

Junuuu 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이 된다면 막을 수 있다.