기술면접

트랜잭션 격리수준이 무엇인가요?

하루우울루 2024. 12. 7. 11:50

트랜잭션의 격리 수준(Transaction Isolation Level)은 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할 지 말지를 결정하는 것이다.

낮은 격리 수준은 동시 처리 능력을 높이지만, 데이터의 일관성 문제를 발생시킬 수 있다.

반면에 높은 격리 수준은 데이터의 일관성을 보장하지만, 동시처리 능력이 떨어질 수 있다.

데이터 정합성과 성능이 반비례한다는 것이다.


ANSI/ISO SQL 표준에서는 4가지 트랜잭션 격리 수준을 정의하고 있다.

1. READ UNCOMMITTED

READ UNCOMMITTED는 가장 낮은 격리 수준으로, 다른 트랜잭션에서 커밋되지 않은 데이터를 읽을 수 있다.

Dirty Read, Non - Repeatable Read, Phantom Read 발생 가능하다.

데이터 정합성이 떨어지지만 성능은 가장 좋다.

2. READ COMMITTED

대부분의 데이터베이스의 기본 격리 수준이다.

커밋된 데이터만 읽을 수 있고, Non - Repeatable Read, Phantom Read 발생 가능하다.

Dirty Read 방지한다.

3. REPEATABLE READ

트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회가 가능하다.

같은 트랜잭션 내에서는 똑같은 결과를 보장한다.

Phantom Read 발생 가능, Dirty Read, Non - Repeatable Read 방지

4. SERIALIZABLE

가장 높은 격리 수준이다.

완벽한 읽기 일관성 모드를 제공한다.

모든 부정합 문제를 방지한다.

성능은 가장 낮다.

Mysql의 경우 단순한 SELECT쿼리가 실행되도 데이터베이스 잠금이 걸려 다른 트랜잭션에서 데이터에 접근할 수 없다.


여기서 부정합 문제란 무엇인가 하면,

 

Dirty Read : 커밋되지 않은 데이터를 다른 트랜잭션에서 읽는 것

데이터의 일관성을 깨뜨릴 수 있다.

Non - Repeatable Read : 같은 트랜잭션 내에서 같은 데이터를 여러 번 읽을 때 다른 값이 조회되는 현상

예를 들어, 한 트랜잭션이 같은 데이터를 두 번 읽을 때, 첫 번째 읽기와 두 번째 읽기 사이에 다른 트랜잭션이 해당 데이터를 변경했을 경우 발생할 수 있다.

Phantom Read : 같은 조건으로 조회했을 때 이전에 없던 레코드가 나타나는 현상

한 트랜잭션 내에서 일관성 없는 결과를 가져올 수 있다.

예를 들어, 한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때, 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우가 있다.


격리수준을 선택할 때는 데이터 정합성과 동시성(성능) 사이의 트레이드오프를 고려해야 한다.

높은 격리 수준은 데이터 정합성은 보장하지만 성능이 떨어지고, 낮은 격리 수준은 성능은 좋지만 데이터 정합성에 문제가 발생할 수 있다.