eelseungmin

Concurrency Control (2) - Isolation Level(feat. Anomaly)

by eelseungmin

들어가며

이번엔 트랜잭션의 Isolation Level에 대해 정리할 것이다.

Isolation Level에 앞서 Isolation이 보장되지 않았을 때 나타날 수 있는 여러 이상현상(Anomaly)들을 먼저 설명한다.

 

Anomaly

Dirty Read(1)

commit되지 않은 데이터를 읽을 때 발생할 수 있는 현상을 의미한다.

첫 번째 예시다. tx2에서 y를 70으로 변경했지만 해당 트랜잭션을 commit하지 않고 rollback함으로써 tx1의 결과에도 영향을 미치는 모습이다.

 

Dirty Read(2)

이번엔 변화를 발생시킨 트랜잭션이 rollback되지 않았음에도 Dirty Read가 발생하는 예시다. tx1에서 x를 10으로 변경했고 commit되지 않은 상태에서 tx2를 수행했더니 tx2에서의 x + y 값은 100이 아니라 60이 되어서 데이터 정합성이 깨진 모습이다.

 

Non-Repeatable Read

한 트랜잭션 내에서 같은 데이터를 여러 번 읽었을 때 값이 일치하지 않는 현상을 말한다.

1번 트랜잭션을 봤을 때 x를 두 번 읽었는데 각각 10과 50으로 값이 일치하지 않는다.

 

Phantom Read(1)

같은 조건으로 데이터를 여러 번 읽었을 때 결과에 처음에 없었던 데이터가 추가되는 현상을 의미한다.

tx2에서 v를 10으로 변경하면서 v=10인 데이터를 두 번째로 조회했더니 t2가 추가된 모습이다.

 

Phantom Read(2)

tx1에서 v>10인 데이터를 조회했을 때는 일치하는 튜플이 없고, tx2의 작업들을 수행한 뒤 같은 맥락의 데이터인 cnt를 조회했더니 0이 아니라 1이 나오는 모습이다.

 

Dirty Write

commit이 되지 않은 데이터를 변경하려고 할 때 발생할 수 있는 현상을 말한다.

tx1이 rollback되었을 때 tx2의 write x=100 작업이 사라지게 된다.

 

Lost Update

tx2에서 commit된 변경사항이 있었음에도 tx1의 작업에 덮어씌워져서 유실되는 모습이다.

 

Read Skew

inconsistent read가 발생하는 현상을 말한다.

초기 x + y의 값은 100이므로 계속해서 해당 값이 유지되어야 하지만, tx2에서의 x와 y를 더해보면 140이 나오므로 데이터 불일치가 발생하는 모습이다. 만약 tx2에서 두 번의 연산 모두 x를 read하는 것이었다면 이는 Non-Repeatable Read라고도 할 수 있다.

 

Write Skew

inconsistent write가 발생하는 현상을 의미한다.

x+y가 0 이상이어야 한다는 조건이 있다고 할 때, tx2에서 y를 -40으로 변경하는 작업이 기대와는 다르게 abort되지 않고 그대로 commit되어 문제가 발생한 모습이다.

 

Isolation Level

MySQL의 InnoDB 기준이다.

표에서 아래로 갈수록 트랜잭션의 격리 수준이 높아지고, 그에 따라 발생하는 이상현상도 줄어들게 된다.

추가로 RDBMS의 종류에 따라 사용하는 Isolation Level에 조금씩 차이가 있으므로 본인이 사용하는 RDBMS에 대해서 잘 파악하는 것이 중요하다.

Isolation Level Dirty Read Non-Repeatable Read Phantom Read
Read Uncommitted O O O
Read Committted X O O
Repeatable Read X X O
Serializable X X X

 

블로그의 정보

eel.log

eelseungmin

활동하기