[Daily morning study] 트랜잭션 격리 수준 (Isolation Levels)

#daily morning study

Image


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

개요

트랜잭션 격리 수준은 동시에 실행되는 여러 트랜잭션 간의 상호작용을 어떻게 처리하는지를 정의합니다. 데이터베이스의 트랜잭션은 원자성을 보장해야 하며, 격리 수준은 데이터의 일관성을 유지하기 위해 트랜잭션 간의 상호 작용을 제어합니다.

트랜잭션 격리 수준의 종류

트랜잭션 격리 수준은 다음과 같은 네 가지로 나뉩니다.

  1. READ UNCOMMITTED
    • 가장 낮은 격리 수준으로, 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있습니다.
    • 이로 인해 더티 리드(Dirty Read) 가 발생할 수 있습니다.
    • 예제: 한 트랜잭션에서 변경한 데이터가 커밋되기 전 다른 트랜잭션이 해당 데이터를 읽는 경우.
  2. READ COMMITTED
    • 트랜잭션이 커밋된 데이터만 읽습니다.
    • 더티 리드를 방지하지만, 논 리피터블 리드(Non-Repeatable Read)가 발생할 수 있습니다.
    • 예제: 첫 번째 트랜잭션에서 특정 데이터를 읽은 후, 두 번째 트랜잭션이 해당 데이터를 갱신하고 커밋하면, 첫 번째 트랜잭션이 동일 데이터를 다시 읽을 때 다른 결과를 얻을 수 있습니다.
  3. REPEATABLE READ
    • 트랜잭션 시작 이후에 읽은 데이터는 트랜잭션이 완료될 때까지 변하지 않습니다.
    • 논 리피터블 리드를 방지하지만, 팬텀 리드(Phantom Read) 라는 문제가 발생할 수 있습니다.
    • 예제: 첫 번째 트랜잭션에서 특정 조건의 데이터를 읽은 후, 두 번째 트랜잭션이 새로운 데이터를 삽입하면, 첫 번째 트랜잭션이 다시 같은 쿼리를 실행할 때 새로운 데이터가 포함될 수 있습니다.
  4. SERIALIZABLE
    • 가장 높은 격리 수준으로, 트랜잭션이 완전히 직렬적으로 실행된 것처럼 보입니다.
    • 모든 트랜잭션이 이전에 커밋된 결과만 사용할 수 있어 더티 리드, 논 리피터블 리드, 팬텀 리드가 모두 방지됩니다.
    • 단점: 성능이 저하될 수 있으며, 잠금으로 인해 동시성이 낮아질 수 있습니다.

각 격리 수준의 특징

격리 수준더티 리드논 리피터블 리드팬텀 리드성능
READ UNCOMMITTED가능가능가능최저
READ COMMITTED불가능가능가능낮음
REPEATABLE READ불가능불가능가능보통
SERIALIZABLE불가능불가능불가능최고 (하지만 느림)

트랜잭션 격리 수준 설정 예시

PostgreSQL과 MySQL에서는 트랜잭션 격리 수준을 쉽게 설정할 수 있습니다. 아래는 SQL을 통해 격리 수준을 변경하는 방법입니다.

PostgreSQL

-- 트랜잭션 시작
BEGIN;

-- 격리 수준 변경
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 쿼리 실행
SELECT * FROM your_table;

-- 트랜잭션 커밋
COMMIT;

MySQL

-- 트랜잭션 시작
START TRANSACTION;

-- 격리 수준 변경
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 쿼리 실행
SELECT * FROM your_table;

-- 트랜잭션 커밋
COMMIT;

결론

트랜잭션 격리 수준은 데이터베이스의 일관성을 유지하는 데 중요한 역할을 합니다. 각 격리 수준은 장단점이 있으며, 애플리케이션의 요구사항에 맞는 적절한 수준을 선택해야 합니다. 성능과 일관성 사이의 균형을 잘 맞추어야 합니다.

이번 학습을 통해 트랜잭션 격리 수준의 개념과 각 수준의 특성을 이해했기를 바랍니다. 앞으로 데이터베이스 설계시 이 내용을 잘 활용해보면 좋겠습니다.