개요

Isolation level 은 트랜잭션에서 일관성이 없는 데이터를 어느 수준까지 허용할 것인지를 정의한다. isolation level 이 낮을수록 많은 사용자가 동일한 데이터에 동시에 접근할 수 있는 성능이 향상되지만, 이는 잘 못된 데이터를 읽거나 데이터의 업데이트가 손실되는 등과 같은 증상을 유발할 수 있다.

반대로 isolation level 이 높을수록 문제가 발생할 확률은 줄어들지만, 동일한 데이터에 동시에 접근할 수 있는 성능은 떨어진다. 따라서 데이터베이스 시스템은 보통 네 종류의 isolation level을 정의하고, 알맞은 격리 수준을 선택할 수 있도록 하였다.

용어 설명

격리 수준에 대해 알아보기 전에 Dirty Read, Non-repeatable Read, Phantom Read 가 무엇인지 알아야한다.

Dirty Read

커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생한다.

Transaction 1Transaction 2
SELECT age FROM users WHERE id = 1;
UPDATE users SET age = 21 WHERE id = 1;
SELECT age FROM users WHERE id = 1;
ROLLBACK;

Non-repeatable Read

한 트랜잭션 내에서 같은 쿼리를 두 번 수행할 때, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제함으로써 첫 번째와 두 번째 조회의 결과가 다르게 나타나는 현상을 말한다.

Transaction 1Transaction 2
SELECT age FROM users WHERE id = 1;
UPDATE users SET age = 21 WHERE id = 1;
COMMIT;
SELECT age FROM users WHERE id = 1;
COMMIT;

Phantom Read

한 트랜잭션 내에서 일정 범위의 레코드를 두 번 이상 읽을 때, 첫 번째 쿼리에서는 없었던 레코드가 이후의 쿼리에서 나타나는 현상을 말한다.

Transaction 1Transaction 2
SELECT age FROM users WHERE age < 20
INSERT INTO users(name, age) VALUES ('홍길동', 10);
COMMIT;
SELECT age FROM users WHERE age < 20;
COMMIT;

Isolation level

앞서 설명한대로 데이터베이스에서는 보통 네 종류의 isolation level을 제공한다.

Read Uncommitted

커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다. Dirty Read, Non-repeatable Read, Phantom Read 현상이 발생한다.

Read Committed

커밋된 데이터만 다른 트랜잭션이 읽는 것을 허용한다. Non-repeatable ReadPhantom Read 현상이 발생한다. 대부분의 DBMS가 기본모드로 채택하고 있는 모드이다.

Repeatable Read

선행 트랜잭션이 읽은 데이터의 트랜잭션이 종료될 때까지 후행 트랜잭션은 이 데이터를 갱신하거나 삭제할 수 없게 한다. 같은 데이터를 여러 번 조회하여도 일관성 있는 결과를 보장한다. Phantom Read 현상이 발생한다.

Serializable Read

선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못하게 할 뿐만 아니라, 새로운 레코드를 삽입하는 것도 막는다. 완벽한 읽기 일관성 모드를 제공한다.