트랜잭션 격리 수준(Isolation Level)
격리 수준(Isolation Level)이란 무엇일까?
동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정하는 것
4가지의 Level로 구분됩니다
READ UNCOMMITTED
COMMIT 되지 않은 데이터를 읽을 수 있다.
READ COMMITTED
COMMITTED된 데이터만 읽을 수 있다.
REPETABLE READ
COMMITTED 된 데이터만 읽을 수 있다.
어떤 데이터를 읽는 도중 변경이 허용되지 않는다.
SERIALIZABLE
COMMITTED 된 데이터만 읽을 수 있다.
어떤 데이터를 읽는 도중 변경(Update)이 허용되지 않는다.
어떤 데이터를 읽는 도중 삭제(Delete)나 추가(Insert)를 허용하지 않는다.
Dirty Read, Non-repetable Read, Phantom Read는 무엇일까요?
아래와 같은 Users Table을 가지고 있다고 가정하겠습니다.
Dirty Read
트랜잭션이 COMMITTED 되지 않은 값을 읽어옵니다.
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
트랜잭션이 어떤 데이터를 읽는 도중 변경이 되는 경우
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 되는 경우
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이 된다면 막을 수 있다.