스물두줄

컴퓨터시스템응용기술사 · 개념서 · 데이터베이스 및 데이터 처리

데이터베이스 트랜잭션

설명 영상 데이터베이스 트랜잭션 · 2:39

왜 배우는가: 트랜잭션은 은행 이체, 예약, 재고 차감처럼 데이터 정합성이 중요한 모든 정보시스템의 기반 개념이다. 기술사 시험에서는 ACID 정의와 상태전이, 동시성 문제 해결 기법이 2교시와 3교시에 반복해서 출제된다.

출제 이력: 제131회 3교시 4번, 제116회 2교시 5번

1. 한 줄 정의와 핵심 키워드

답안 첫 줄에 쓸 정의는 다음과 같다.

트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위로 묶인 연산들이며, ACID 속성으로 신뢰성 있는 처리를 보장하는 단위이다.

핵심 키워드는 다음과 같다.

  • 트랜잭션(Transaction)
  • ACID: 원자성, 일관성, 격리성, 지속성
  • COMMIT과 ROLLBACK
  • 동시성 제어(Concurrency Control)
  • 로그 기반 회복(Log-based Recovery)
  • 직렬성(Serializability)
  • 격리 수준(Isolation Level)

2. 개념 풀이

쉽게 말하면 트랜잭션은 "전부 되거나, 전부 안 되거나" 하는 한 묶음의 작업이다. 예를 들어 계좌 A에서 돈을 빼고 계좌 B에 넣는 작업은 두 연산이 함께 성공해야 의미가 있다. 중간에 하나만 끝나면 돈이 사라지거나 생기므로 이를 막아야 한다.

정식으로는 DBMS가 데이터를 읽고 쓰는 연산들의 논리적 단위를 트랜잭션이라 한다. 트랜잭션의 경계는 BEGIN, COMMIT, ROLLBACK 같은 명령으로 정해진다. 여러 SQL 문을 하나로 묶어 ACID 속성을 적용하는 것이 핵심이다.

원자성(Atomicity)은 트랜잭션의 모든 연산이 모두 성공하거나 모두 실패함을 뜻한다. 실패하면 이미 수행한 결과를 원상복구하여 중간 상태가 남지 않게 한다.

일관성(Consistency)은 트랜잭션 수행 전후에 데이터베이스가 무결성 제약조건을 만족하는 상태를 유지함을 뜻한다. 트랜잭션 논리의 정확성은 프로그래머 책임이고, 제약조건 강제는 DBMS 책임이라는 구분이 중요하다.

격리성(Isolation)은 동시에 실행되는 트랜잭션들이 서로 간섭하지 않고 독립적으로 실행되는 것처럼 보이게 함을 뜻한다. 한 트랜잭션의 중간 변경이 다른 트랜잭션에 보이지 않도록 한다.

지속성(Durability)은 COMMIT된 결과가 시스템 장애 뒤에도 영구히 남음을 뜻한다. 로그와 백업으로 구현한다.

3. 등장 배경과 필요성

초기 파일 처리 방식에서는 프로그램이 죽으면 데이터가 반쯤만 바뀌는 일이 흔했다. 여러 사용자가 같은 데이터를 동시에 고치면 갱신 손실이 생겼다. 이런 문제를 체계적으로 막기 위해 트랜잭션 개념과 ACID 원칙이 정리되었다.

ACID라는 용어는 1983년 Härder와 Reuter의 논문에서 체계화되었다. 이후 관계형 DBMS의 표준 동작 원칙이 되었다. 최근에는 분산 DB와 NoSQL에서 ACID를 그대로 지키기 어려워 BASE 모델과 비교하는 흐름이 생겼다. 즉 ACID는 무결성 보장의 기준선으로서 여전히 필요하다.

금융 거래처럼 금액 오류가 곧 손실인 시스템에서는 격리 수준을 낮추는 것보다 정합성을 먼저 확보하는 것이 중요하다. 그래서 트랜잭션 개념은 DB 설계의 출발점이 된다.

4. 구성요소·원리·절차

트랜잭션 처리 시스템은 트랜잭션 관리자(Transaction Manager), 회복 관리자(Recovery Manager), 동시성 제어기(Concurrency Control), 로그 관리자(Log Manager), 버퍼 관리자(Buffer Manager)로 구성된다. 각 구성요소가 ACID 속성 하나 이상을 담당한다.

구성요소담당 역할관련 ACID 속성
트랜잭션 관리자BEGIN, COMMIT, ROLLBACK 명령 처리원자성
회복 관리자로그 기반 UNDO·REDO 수행, 체크포인트 관리원자성, 지속성
동시성 제어기잠금·버전 관리로 실행 순서 통제격리성
로그 관리자변경 내역을 로그 파일에 순차 기록지속성
버퍼 관리자메모리 버퍼와 디스크 간 데이터 이동일관성, 지속성

표의 구성요소는 서로 독립적이지 않다. 회복 관리자는 로그 관리자의 기록에 의존하고, 동시성 제어기는 롤백 시 회복 관리자에 의존한다. 이 의존 관계가 원자성과 격리성이 직교하지 않는 이유다.

트랜잭션 처리의 핵심 원리는 변경을 로그에 먼저 기록하는 것이다(Write-Ahead Logging, WAL).

데이터 반영 방식은 두 가지다. 즉시 갱신(Immediate Update)은 로그 기록과 버퍼의 데이터베이스 반영이 동시에 진행될 수 있다. 부분 완료 시점에는 갱신 데이터가 이미 로그에 기록된 상태여야 한다. 지연 갱신(Deferred Update)은 로그 기록이 끝난 뒤 부분 완료를 하고, 그 다음에 버퍼를 데이터베이스로 옮긴다. 지연 갱신은 실패 시 UNDO가 필요 없고 REDO만 수행하면 된다.

트랜잭션 처리 절차는 다음과 같다.

  • BEGIN 으로 트랜잭션을 시작하고 변경 연산을 로그에 기록한다.
  • 동시성 제어기가 잠금 또는 버전을 확인하여 충돌 여부를 판단한다.
  • 모든 연산이 성공하면 부분 완료(Partially Committed) 상태로 전이한다.
  • 로그에 COMMIT 레코드를 기록하고 로그를 디스크에 강제 기록(Force)한다.
  • 실패하면 로그를 역순으로 읽어 UNDO하고 ROLLBACK 한다.
  • 체크포인트 시점에 버퍼를 디스크에 반영하여 회복 대상 로그 범위를 줄인다.

체크포인트(CheckPoint, 검사점)는 회복 관리자가 일정 간격으로 만드는 검사 시점이다. 로그는 그대로 유지하면서 회복 시 검색할 로그 양을 줄인다.

다음 도식은 구성요소 간 연결을 보인다.

트랜잭션 처리 구성도

5. 관련 법령·기준·표준

트랜잭션 처리 자체를 규정한 법령은 없고, 데이터베이스 제품의 기능 기준과 국제 표준이 기준 역할을 한다. 국내 공공 기준으로 직접 인용할 조항 번호는 확인되지 않아 이름만 적는다.

기준내용기준 수치·조건
ACID 4대 속성원자성, 일관성, 격리성, 지속성4개 속성 모두 충족
SQL 표준 격리 수준4단계 격리 수준READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE
2단계 잠금(2PL)확장 단계와 축소 단계잠금 획득 후 해제 단계 진입 후 신규 잠금 금지
체크포인트일정 간격의 검사 시점시간 간격은 회복 관리자가 정함

Write-Ahead Logging(WAL)은 데이터 변경보다 로그가 먼저 디스크에 기록되어야 한다는 원칙이다. 이 원칙을 지키지 않으면 장애 시 UNDO 정보가 사라진다.

직렬성(Serializability)은 동시 실행 결과가 어떤 직렬 실행 결과와 같아야 한다는 기준이다. 2단계 잠금(Two-Phase Locking, 2PL)은 이를 보장하는 대표 방법이다. 2PL은 직렬성을 보장하지만 교착 상태를 막지는 못한다.

격리 수준은 SQL 표준에서 정의한 네 단계다. 낮은 수준일수록 동시성은 높아지고 Dirty Read, Non-repeatable Read, Phantom Read 같은 현상이 허용된다. 높은 수준은 자원 사용이 많고 대기가 늘어난다.

다중 버전 동시성 제어(MVCC)는 데이터를 덮어쓰지 않고 새 버전을 만든다. 읽기 트랜잭션이 잠금 없이 과거 버전을 읽을 수 있다. 가장 흔한 MVCC 격리 수준은 스냅샷 격리다.

국제 표준 기준으로는 ISO/IEC 9075(SQL 표준)가 트랜잭션 문법과 격리 수준을 정의한다. 번호는 확실할 때만 쓰는데, 이 항목은 이름만 적는다.

데이터베이스 제품별 기본 격리 수준은 제품 버전마다 다르므로 제품 문서를 확인해야 한다.

6. 유형과 비교

트랜잭션 처리 방식은 실행 방식과 동시성 제어 방식에 따라 나뉜다. 두 축을 분리해 보면 시험 답안에서 헷갈리는 항목을 정리하기 쉽다. 먼저 격리 수준(Isolation Level)별 허용 현상을 비교한다.

비교 항목Read UncommittedRead CommittedRepeatable ReadSerializable
Dirty Read허용방지방지방지
Nonrepeatable Read허용허용방지방지
Phantom Read허용허용발생할 수 있음(표준 기준, 방지 여부는 DBMS 구현에 따라 다를 수 있음)방지
동시성가장 높음높음중간가장 낮음

격리 수준이 높을수록 현상은 줄지만 락 대기가 늘어난다. Read Committed는 Oracle, PostgreSQL 등에서 흔히 쓰는 기본 설정이다. Phantom Read는 표준 기준으로 발생할 수 있으며, 방지 여부는 DBMS 구현에 따라 다를 수 있다.

이어지는 내용

로그인하면 하루 2페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 단원 읽기