트랜젝션이란?

공부용·2025년 8월 26일

트랜젝션

하나의 작업 단위로 처리되는 쿼리(query)의 모음이다.

  • 목적: 주로 데이터를 변경하고 수정하는 데 사용되지만, 특정 시점의 일관된 데이터를 얻기 위한 읽기 전용(read only) 트랜잭션도 가능하다
  • 예시: 한 계좌에서 다른 계좌로 돈을 이체하는 작업이 트랜잭션의 좋은 예이다. 이 작업은 잔액 환인(SELECT), 출급(UPDATE), 입금(UPDATE) 쿼리들로 구성될 수 있다.

트랜젝션 생명주기

  • 트랜잭션은 BEGIN으로 시작하고, 모든 작업이 성공적으로 완료되면
  • COMMIT을 통해 변경 사항을 영구히 저장한다.
  • 만약 중간에 문제가 발생하면 ROLLBACK을 통해 이전의 모든 작업을 취소하며
  • 시스템 충돌과 같은 예기치 않은 종료 시에도 ROLLBACK이 실행된다.

Write-back Cache

변경 사항을 즉시 디스크에 쓰지 않고, 먼저 메모리의 캐시 공간에 저장한다. 이렇게 하면 여러 쓰기 작업을 메모리에서 빠르게 처리한 후, 나중에 한꺼번에 디스크에 쓸 수 있어 쓰기 성능이 향상된다.

  • 장점:

    • 빠른 응답 속도: 쓰기 작업이 메모리에서 즉시 완료되므로 애플리케이션의 응답 시간이 짧다.
    • 높은 처리량: 디스크 I/O(입출력) 병목 현상이 줄어들어 전반적인 시스템 성능이 향상된다.
  • 단점:

    • 데이터 유실 위험: 변경 사항이 디스크에 기록되기 전에 시스템에 장애(예: 정전)가 발생하면, 메모리에만 있던 데이터가 유실될 위험이 있다.

Write-through Cache

데이터 변경이 발생하면 메모리 캐시와 디스크에 동시에 기록한다. 데이터가 즉시 영구 저장소에 보관되므로 데이터의 일관성과 안정성이 매우 높다

  • 장점:

    • 높은 데이터 안정성: 쓰기 작업이 완료되면 데이터가 디스크에 즉시 저장되므로, 시스템 장애가 발생해도 데이터가 유실될 염려가 거의 없다.
  • 단점:

    • 느린 쓰기 속도: 모든 쓰기 작업이 디스크에 기록될 때까지 기다려야 하므로 상대적으로 속도가 느리다. 이는 특히 디스크 I/O가 많은 환경에서 성능 저하의 원인이 될 수 있다.

Write-Ahead Logging

대부분의 현대 데이터베이스는 위 두 방식의 장점을 절충한 WAL(Write-Ahead Logging) 기법을 사용한다.

실제 데이터 변경 사항(예: 테이블, 인덱스)을 디스크에 쓰기 전에, 변경 내용에 대한 로그를 먼저 디스크에 기록한다.

  1. 로그 기록: 트랜젝션의 모든 변경 내용이 로그 파일에 순차적으로 기록된다.
  2. 메모리 변경: 로그가 기록된 후, 실제 데이터는 메모리(버퍼 캐시)에서 변경된다.
  3. 나중에 디스크에 반영: 메모리에서 변경된 데이터는 나중에 특정 시점(체크포인트)에 한꺼번에 디스크에 기록된다.

로그 파일만 디스크에 즉시 기록하면 되므로, 실제 데이터 파일 전체를 쓰는 것보다 훨씬 빠르다. 만약 시스템에 장애가 발생하더라도, 디스크에 기록된 로그를 보고 메모리에서 미처 디스크로 옮겨지지 못한 변경 사항을 복구할 수 있어 데이터 안정성과 성능을 모두 확보할 수 있다.

데이터베이스는 운영체제에게 로그를 디스크에 "반드시" 쓰도록 fsync와 같은 명령을 내리는데, 이 과정이 너무 빈번하면 성능에 영향을 줄 수 있다. 따라서 fsync호출 빈도를 조절하여 안정성과 성능 사이의 균형을 맞춰야한다.

순차 쓰기

새로 들어온 책을 일단 '신규 도서' 코너의 빈자리에 순서대로 쭉 쌓아두는 것과 같다. 작업이 매우 빠르고 단순하다

로그 파일은 트랜잭션의 변경 내용을 시간 순서대로 파일의 맨 끝에 추가하기만 한다. 이것은 디스크의 읽기/쓰기 헤드가 한 방향으로 쭉 움직이며 데이터를 쓰는 것과 같아서 매우 빠르다

디스크에 여러 다른 물리적 위치에 흩어진 데이터를 수정하는 직접 쓰기와 다르다.
직접 쓰기는 데이터가 저장된 각각의 물리적 위치를 모두 찾아가서 수정해야하기 때문에 순차 쓰기보다 느릴 수 있다.

profile
공부 내용을 가볍게 적어놓는 블로그.

0개의 댓글