Search

트랜잭션 및 독립성 레벨 개념

트랜잭션
트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능 (예 : Update, Delete)을 수행하기 위한 작업의 단위 혹은 일련의 연산들을 말한다.
트랜잭션은 아래의 ACID 특성을 만족해야 한다.
원자성 (Atomicity)
트랜잭션의 연산은 데이터베이스에 전부 반영이 되어야하거나 전부 반영이 되지 않아야한다.
즉, 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
일관성 (Consistency)
트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.
독립성 (Isolation)
하나의 트랜잭션이 실행하고 있는 도중에 다른 트랜잭션이 하이재킹할 수 없다.
수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
지속성 (Durability)
성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.
트랜잭션 독립성 레벨
트랜잭션 독립성 레벨은 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 제어하는 수준을 정의합니다.
독립성 레벨은 데이터 일관성과 성능 간의 trade-off를 조정합니다.
낮은 독립성 레벨은 성능을 높이지만 데이터 불일치 문제를 일으킬 가능성이 높고, 높은 독립성 레벨은 일관성을 보장하지만 성능이 저하될 수 있습니다.

주요 독립성 문제

Dirty Read : 한 트랜잭션이 아직 커밋되지 않은 데이터를 읽음. 이후 해당 트랜잭션이 롤백되면 잘못된 데이터를 읽은 문제가 발생
Non-Repeatable Read : 같은 트랜잭션 내에서 동일한 데이터를 여러 번 읽을 때 값이 달라짐(다른 트랜잭션이 중간에 데이터를 수정하고 커밋)
Phantom Read : 트랜잭션 내에서 동일한 쿼리를 여러 번 실행할 때 결과 행이 추가되거나 삭제됨(다른 트랜잭션이 행을 삽입/삭제하고 커밋)

독립성 레벨 종류

Read Uncommitted (커밋되지 않은 읽기)
트랜잭션이 커밋되지 않은 데이터를 읽을 수 있음
문제: Dirty Read 발생 가능
장점: 성능이 가장 빠름
사용 사례: 데이터 일관성이 덜 중요한 분석 쿼리
Read Committed (커밋된 읽기)
커밋된 데이터만 읽을 수 있음
문제: Non-Repeatable Read, Phantom Read 발생 가능
장점: Dirty Read 방지, 대부분의 DBMS에서 기본 설정
사용 사례: 일반적인 애플리케이션에서 사용
Repeatable Read (반복 가능 읽기)
같은 트랜잭션 내에서 동일한 데이터를 여러 번 읽을 때 항상 같은 결과를 보장
문제: Phantom Read 발생 가능
장점: Non-Repeatable Read 방지
사용 사례: 데이터 일관성이 중요한 트랜잭션
Serializable (직렬화 가능)
트랜잭션이 순차적으로 실행되는 것처럼 완전한 격리 보장.
문제: 성능 저하(락 사용 증가)
장점: 모든 동시성 문제(Dirty Read, Non-Repeatable Read, Phantom Read) 방지
사용 사례: 높은 데이터 일관성이 필요한 금융 시스템