본문 바로가기
프로그래밍

트랜잭션과 병행 제어: 데이터베이스의 신뢰성을 지키는 핵심 원리

by 유형제맘 2025. 8. 6.

✅ 트랜잭션(Transaction) 이란?

트랜잭션이란 데이터베이스에서 하나의 논리적인 작업 단위를 말합니다. 즉, 여러 SQL 작업을 하나로 묶어서 모두 성공하거나 모두 실패해야 하는 단위입니다.

예를 들어, 은행 계좌 이체 시:

  • A 계좌에서 10만원 출금
  • B 계좌에 10만원 입금

이 두 작업이 동시에 성공하거나, 동시에 실패해야 데이터 일관성이 보장됩니다.

▶ 트랜잭션의 특징: ACID
트랜잭션은 아래의 네 가지 속성(ACID)을 만족해야 합니다.

명령어 설명
Atomicity (원자성) 모든 작업이 전부 수행되거나, 전혀 수행되지 않아야 함
Consistency (일관성) 트랜잭션 전후에 데이터의 무결성이 유지되어야 함
Isolation (고립성) 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않아야 함
Durability (지속성) 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 함

✅ 트랜잭션의 제어 명령어

트랜잭션은 일반적으로 다음 명령어로 제어됩니다:

명령어 설명
BEGIN / START TRANSACTION 트랜잭션 시작
COMMIT 트랜잭션 성공 → 변경사항 저장
ROLLBACK 트랜잭션 실패 → 변경사항 모두 취소
SAVEPOINT 중간 저장 지점 설정
ROLLBACK TO SAVEPOINT 특정 저장 지점까지 롤백

예시:

START TRANSACTION;

UPDATE account SET balance = balance - 10000 WHERE name = 'A';
UPDATE account SET balance = balance + 10000 WHERE name = 'B';

COMMIT;

✅ 병행 제어(Concurrency Control)

여러 사용자가 동시에 데이터에 접근하거나 수정할 경우 발생할 수 있는 충돌이나 오류를 방지하기 위해 병행 제어가 필요합니다.

▶ 대표적인 문제점들

문제 설명
Dirty Read 다른 트랜잭션의 아직 커밋되지 않은 데이터를 읽음
Non-repeatable Read 같은 쿼리를 두 번 실행했는데 결과가 달라짐 (다른 트랜잭션이 중간에 데이터를 수정)
Phantom Read 처음 쿼리에는 없던 새로운 데이터가 다음 쿼리에서 나타남

✅ 트랜잭션 격리 수준 (Isolation Level)

병행 제어 문제를 해결하기 위해, DBMS는 격리 수준을 설정할 수 있게 해줍니다. 격리 수준이 높을수록 데이터의 일관성은 높아지지만 성능은 낮아질 수 있습니다.

격리 수준 설명 방지 가능 문제
READ UNCOMMITTED 커밋되지 않은 데이터도 읽음 없음
READ COMMITTED 커밋된 데이터만 읽음 Dirty Read
REPEATABLE READ 동일한 SELECT 결과 유지 Dirty + Non-repeatable Read
SERIALIZABLE 가장 엄격한 수준. 트랜잭션을 순차적으로 실행 Dirty + Non-repeatable + Phantom Read

✅ 잠금(Lock) 메커니즘

DBMS는 데이터 무결성을 지키기 위해 락(Lock) 을 사용합니다. 잠금은 트랜잭션 간의 충돌을 방지하는 핵심 메커니즘입니다.

Lock 종류 설명
Shared Lock (S Lock) 읽기 전용. 다른 트랜잭션도 읽을 수 있음
Exclusive Lock (X Lock) 쓰기 가능. 다른 트랜잭션은 읽거나 쓸 수 없음
Table Lock 테이블 전체 잠금
Row Lock 특정 행만 잠금

💡 정리: 트랜잭션과 병행 제어는 왜 중요한가?

  • 사용자 수가 많고, 데이터 변경이 잦은 환경에서는 반드시 트랜잭션과 병행 제어가 필요합니다.
  • 이것이 없다면 데이터 무결성, 신뢰성, 안정성이 보장되지 않아 시스템 전체에 큰 혼란을 초래할 수 있습니다.
  • 특히 실무에서는 격리 수준과 성능 간의 적절한 균형이 중요합니다.

📝 마무리 요약

  • 트랜잭션: 데이터베이스 작업의 논리적 단위 (ACID 만족)
  • 트랜잭션 제어: BEGIN, COMMIT, ROLLBACK, SAVEPOINT
  • 병행 제어: 여러 트랜잭션 간 충돌 방지
  • 격리 수준: READ UNCOMMITTED → SERIALIZABLE (높을수록 안전, 느림)
  • 락: 데이터 잠금으로 충돌 방지 (Shared, Exclusive, Row, Table)