Database

트랜잭션(Transaction)과 동시성 제어(Concurrency Control)

Somaz 2025. 6. 26. 19:36
728x90
반응형

Overview

오늘은 데이터베이스 트랜잭션(Transaction)과 동시성 제어(Concurrency Control) 개념에 대해 알아보려고 한다.

 

트랜잭션은 데이터베이스에서 작업을 원자적으로 실행하는 단위이며, 여러 사용자가 동시에 접근할 경우 충돌을 방지하는 동시성 제어 기법이 필요하다.


이번 글에서는 트랜잭션의 개념과 실행 방식, 그리고 대표적인 동시성 제어 기법인 MVCC(Multi-Version Concurrency Control)Locking(잠금) 방식을 비교해 보자.

 

 

 

 

 

 


 

 

1️⃣ 트랜잭션(Transaction)이란?

 

트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위를 의미한다.
트랜잭션 내의 모든 작업이 성공적으로 완료되거나, 하나라도 실패하면 전체가 롤백(Rollback)되어야 한다.

 

 

 

트랜잭션의 특징 (ACID 속성)

트랜잭션은 ACID 원칙을 따라야 한다.

 

속성 설명
Atomicity (원자성) 트랜잭션 내의 모든 작업이 전부 실행되거나 하나라도 실패하면 전부 롤백(Rollback) 되어야 한다.
Consistency (일관성) 트랜잭션이 실행된 후 데이터베이스가 일관된 상태를 유지해야 한다.
Isolation (고립성) 여러 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않아야 한다.
Durability (지속성) 트랜잭션이 성공적으로 완료되면 영구적으로 반영되어야 한다.

 

 

 

 

 

2️⃣ 트랜잭션 실행 방식

트랜잭션은 다음과 같은 과정으로 실행된다.

  1. BEGIN TRANSACTION: 트랜잭션 시작
  2. SQL 실행: INSERT, UPDATE, DELETE 등의 작업 수행
  3. COMMIT: 모든 작업이 성공적으로 완료되면 반영
  4. ROLLBACK: 오류 발생 시 모든 변경 사항 취소

 

 

 

트랜잭션 예제 (MySQL)

-- 트랜잭션 시작
START TRANSACTION;

-- 계좌 A에서 100만원 출금
UPDATE accounts SET balance = balance - 1000000 WHERE account_id = 1;

-- 계좌 B로 100만원 입금
UPDATE accounts SET balance = balance + 1000000 WHERE account_id = 2;

-- 모든 작업이 정상적으로 실행되었으면 커밋
COMMIT;

 

 

만약 두 번째 `UPDATE` 에서 오류가 발생하면 `ROLLBACK` 하여 첫 번째 `UPDATE` 도 취소할 수 있다.

-- 트랜잭션 롤백 예제
ROLLBACK;

 

 

 

 

3️⃣ 동시성 제어(Concurrency Control)란?

동시에 여러 사용자가 동일한 데이터를 변경하려고 할 때, 데이터 무결성을 보장하기 위한 기법이다.

대표적인 동시성 제어 기법은 MVCC(Multi-Version Concurrency Control)Locking(잠금) 방식이 있다.

 

 

 

 

MVCC (Multi-Version Concurrency Control) vs. Locking 방식 비교

비교 항목 MVCC Locking 방식
개념 다중 버전을 유지하여 트랜잭션이 독립적으로 실행됨 특정 데이터를 잠그고 다른 트랜잭션의 접근을 제한
읽기 방식 오래된 데이터를 읽어 충돌을 방지 최신 데이터를 읽지만 다른 트랜잭션과 충돌 가능
쓰기 방식 변경된 데이터를 새로운 버전으로 생성 트랜잭션이 끝날 때까지 잠금 유지
성능 읽기 성능 우수, 쓰기 성능은 부담 쓰기 성능 우수, 읽기 성능은 상대적으로 낮음
사용 예시 PostgreSQL, MySQL(InnoDB), Oracle MySQL(MyISAM), MSSQL
단점 오래된 버전이 많아지면 불필요한 저장 공간 증가 잠금 대기 시간 증가로 인한 성능 저하 가능

 

 

 

MVCC(Multi-Version Concurrency Control) 자세히 살펴보기

MVCC는 트랜잭션 간 충돌을 방지하기 위해 다중 버전의 데이터를 유지하는 방식이다.

 

 

MVCC 주요 개념

  1. Snapshot Isolation (스냅샷 격리)
    • 각 트랜잭션이 실행될 때, 해당 시점의 데이터를 복사해서 사용
    • 이후 트랜잭션이 데이터를 변경해도 다른 트랜잭션의 영향을 받지 않음
  2. Undo Log 활용
    • 변경 전 데이터를 Undo Log에 저장하고, 다른 트랜잭션이 과거 데이터를 조회할 수 있도록 지원

 

 

MVCC의 장점

  • 읽기 작업이 빠름: SELECT 시 데이터를 잠글 필요가 없음
  • 데드락(Deadlock) 발생 가능성이 낮음
  • 트랜잭션 충돌 최소화

 

 

MVCC의 단점

  • 쓰기(UPDATE, DELETE) 성능 저하 가능성
  • 삭제된 데이터가 실제로 즉시 삭제되지 않고 공간 차지
  • Garbage Collection 필요 → 주기적으로 오래된 데이터를 정리해야 함

 

 

 

 

Locking(잠금) 방식 자세히 살펴보기

Locking 방식은 특정 데이터에 대해 트랜잭션이 잠금을 설정하고 다른 트랜잭션의 접근을 제한하는 기법이다.

 

 

Locking 주요 개념

  1. 공유 잠금(Shared Lock, S Lock)
    • 여러 개의 트랜잭션이 동시에 읽을 수 있지만, 쓰기는 제한됨
  2. 배타 잠금(Exclusive Lock, X Lock)
    • 해당 데이터에 대한 읽기 및 쓰기 모두 다른 트랜잭션이 불가능

 

 

Locking의 장점

  • 쓰기 작업이 빠름 → 트랜잭션이 종료되면 즉시 반영됨
  • 불필요한 데이터 복사가 없음

 

 

Locking의 단점

  • 데드락(Deadlock) 발생 가능성
  • 대기 시간이 증가할 가능성 → 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션이 대기해야 함

 

 

 

 

 


 

 

 

 

 

마무리

오늘은 트랜잭션과 동시성 제어에 대해 알아보았다.

 

트랜잭션은 ACID 원칙을 따라야 하며, 동시 실행을 위해 동시성 제어가 필요하다.
MVCC는 읽기 성능이 뛰어나지만 저장 공간을 더 차지하며, Locking 방식은 쓰기 성능이 좋지만 데드락 위험이 있다.
MySQL(InnoDB), PostgreSQL 등은 MVCC를 사용하고, MySQL(MyISAM), MSSQL은 Locking 방식을 활용한다.
사용하는 데이터베이스와 트랜잭션의 특성에 맞춰 적절한 동시성 제어 기법을 선택해야 한다.

 

 

데이터베이스의 성능과 일관성을 유지하기 위해 MVCC와 Locking 방식의 장단점을 잘 이해하고 활용하자!

 

 

 

 

 

 

 

 

 


Reference

 

 

 

728x90
반응형