
현대 데이터베이스 시스템에서는 데이터를 일관성 있고 신뢰성 있게 관리하기 위해 트랜잭션(Transaction) 개념이 매우 중요하다. 트랜잭션이란 무엇인지, 그리고 ACID 특성 중 하나인 원자성(Atomicity)이 트랜잭션 내에서 어떠한 역할을 하는지에 대해 정리한 내용이다.
트랜잭션이란 무엇인가?
-
정의
- 트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적 작업 단위로 취급되는 일련의 SQL 쿼리 집합이다.
- 트랜잭션은 읽기 또는 쓰기 연산들을 포함할 수 있으며, 데이터 무결성과 일관성을 유지하기 위해 하나의 작업 단위로서 취급된다.
-
필요성
- 복잡한 데이터베이스 작업은 단일 쿼리로 처리하기 어려운 경우가 많다.
- 실제 응용 프로그램 로직 구현 시, 여러 쿼리를 순차적으로 실행해야 하는 상황이 빈번하다. 이때 각각의 쿼리를 개별로 처리하면 중간 상태에서 데이터 불일치나 오류가 발생할 수 있다.
- 트랜잭션을 통해 이들 여러 쿼리를 한 덩어리로 묶음으로써, 모든 쿼리가 성공했을 때만 변경사항을 영구히 반영(커밋)하고, 하나라도 실패하면 실패하면 이전 상태로 되돌리는(롤백) 메커니즘을 제공한다.
-
트랜잭션의 라이프 사이클
- 시작(BEGIN): 명시적으로 트랜잭션 시작을 선언하거나, DBMS가 암묵적으로 새 트랜잭션을 시작한다.
- 실행(쿼리 수행): 여러 개의 SELECT, INSERT, UPDATE, DELETE 쿼리를 연속적으로 수행한다.
- 커밋(COMMIT): 모든 쿼리가 성공적으로 완료되면, 해당 변경사항을 영구적으로 디스크에 기록한다.
- 롤백(ROLLBACK): 실행 중 하나라도 실패하거나 문제가 발생한 경우, 이미 수행한 모든 변경사항을 원래 상태로 되돌린다.
-
구현 상의 고려사항
- 트랜잭션 중간에 실제 디스크에 데이터를 바로 기록할지, 메모리에 대기시켰다가 커밋 시점에 기록할지는 DBMS별로 다를 수 있다.
- 각 DBMS는 성능, 안정성, 복구 시나리오 등을 고려하여 트랜잭션 처리 전략을 달리한다. 예를 들어, Postgres는 트랜잭션 중에도 디스크에 자주 기록하여 커밋을 빠르게 하는 전략을 쓰는 반면, 다른 DBMS는 커밋 시점에 한번에 반영하여 다른 장단점을 갖는다.
-
읽기 전용 트랜잭션
- 트랜잭션은 반드시 데이터를 수정해야 하는 것은 아니다. 읽기 전용 트랜잭션을 통해 특정 시점의 일관된 스냅샷을 확보할 수 있다.
원자성(Atomicity)과 트랜잭션
-
원자성의 정의
- 원자성은 트랜잭션 내의 모든 연산(쿼리)이 전부 성공하거나, 하나라도 실패하면 전부 실패한 것으로 간주하여 이전 상태로 되돌리는 성질이다.
- 하나의 트랜잭션은 쪼갤 수 없는 작업 단위로 취급되며 쿼리를 부분적으로만 반영하지 않는다.
-
원자성의 중요성
- 만약 트랜잭션 도중 한 쿼리가 실패하면, 이미 성공한 다른 쿼리들도 모두 취소하고 일관성 있는 상태로 복구한다.
- DB 서버가 다운된다거나 예기치 못한 오류에도 커밋되지 않은 트랜잭션 변경사항은 롤백되어야 한다.
- 원자성이 보장되지 않으면, 중간 상태의 불일치한 데이터가 남아 심각한 데이터 무결성 문제가 발생할 수 있다.
-
e.g. 자금 이체의 상황
- A 계좌에서 B로 100 달러를 송금하는 트랜잭션을 생각해보자.
- 트랜잭션 내에서 A 계좌에서 100 달러 차감, B 계좌에 100 달러 추가라는 두 개의 연산이 있다.
- 중간에 DB가 다운되거나, 두 번째 연산이 실패한다면 이미 차감한 100 달러를 되돌려야 한다.
- 원자성이 보장되면 최종적으로 두 연산이 모두 성공하거나 둘 다 취소되어 데이터 불일치가 생기지 않게 된다.
-
트랜잭션 내부 구현 이슈
- 디스크 쓰기를 빈번히 하면 커밋이 빨라질 수 있으나 롤백 시 복잡해지고, 쓰기를 지연하면 롤백은 쉬워지지만 커밋 시간이 길어질 수 있다.
- 트랜잭션 도중 서버가 다운되면, 재시작 시 미완료 트랜잭션을 감지하고 롤백하는 절차가 필요하다.
- 긴 트랜잭션은 롤백 및 복구 시간이 오래 걸릴 수 있으므로, 트랜잭션 설계를 짧고 명료하게 유지하는 것이 바람직하다.
마치며
트랜잭션은 데이터베이스 운영에 있어 핵심적인 개념으로, 원자성을 비롯한 ACID 특성을 통해 데이터 일관성과 무결성을 보장한다. 그러나 이론적 정의를 실제 시스템에 구현하는 과정에서는 디스크 쓰기 전략, 장애 복구, 동시성 제어, 롤백 비용 관리 등 다양한 구현 이슈들이 발생한다. 각 DBMS는 이러한 이슈를 자체적인 방식으로 해결하며, 사용자는 데이터베이스 구조와 동작 원리를 이해함으로써 자신에게 적합한 시스템을 선택하고 최적화할 수 있다.
이 글은 Udemy의 【한글자막】 데이터베이스 엔지니어링 ( Database Engineering ) 마스터하기!강의를 토대로 공부한 내용을 정리한 것입니다.