[DB] 08. 트랜잭션(Transaction)과 ACID

[DB] 08. 트랜잭션(Transaction)과 ACID

1. 트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스에서 하나의 작업 단위를 의미한다.

여러 개의 SQL 문이 하나의 묶음으로 실행되고, 이 묶음 전체가 모두 성공하거나, 아니면 전부 실패하도록 보장하는 개념이다.

즉, 트랜잭션은 “중간 상태를 허용하지 않기 위한 장치”라고 볼 수 있다.

2. 트랜잭션이 필요한 이유

다음과 같은 상황을 생각해보자.

A 계좌에서 10,000원을 출금해 B 계좌로 입금하는 작업이 있다.

  • A 계좌 잔액 감소
  • B 계좌 잔액 증가

이 두 작업은 반드시 함께 성공해야 한다.

만약 출금만 되고 입금이 되지 않는다면, 데이터는 즉시 잘못된 상태가 된다.

이 두 작업을 하나의 트랜잭션으로 묶지 않으면, 이런 문제가 발생할 수 있다.

3. 트랜잭션의 기본 동작

트랜잭션은 보통 다음 흐름으로 동작한다.

  1. 트랜잭션 시작
  2. 여러 SQL 문 실행
  3. 문제 없으면 COMMIT
  4. 문제 발생 시 ROLLBACK
BEGIN;

UPDATE account
SET balance = balance - 10000
WHERE id = 'A';

UPDATE account
SET balance = balance + 10000
WHERE id = 'B';

COMMIT;

중간에 오류가 발생하면, COMMIT 대신 ROLLBACK이 수행되어 모든 변경 사항이 취소된다.

4. COMMIT과 ROLLBACK

COMMIT은 트랜잭션 내 작업을 “확정”하는 명령이다.

ROLLBACK은 트랜잭션 내 작업을 “모두 취소”하는 명령이다.

ROLLBACK이 수행되면, 트랜잭션 시작 이전 상태로 되돌아간다.

5. ACID란?

ACID는 트랜잭션이 가져야 할 네 가지 성질을 묶어 부르는 용어다.

5-1. Atomicity (원자성)

트랜잭션은 더 이상 쪼갤 수 없는 하나의 단위다.

모든 작업이 성공하거나, 모든 작업이 실패해야 한다.

5-2. Consistency (일관성)

트랜잭션이 완료된 후에도 데이터는 항상 일관된 상태를 유지해야 한다.

제약조건, 무결성 규칙을 깨는 상태로 트랜잭션이 끝나서는 안 된다.

5-3. Isolation (격리성)

동시에 실행되는 트랜잭션은 서로 영향을 주지 않아야 한다.

하나의 트랜잭션이 처리 중인 중간 결과를 다른 트랜잭션이 함부로 볼 수 없어야 한다.

5-4. Durability (지속성)

트랜잭션이 COMMIT되면, 그 결과는 시스템 장애가 발생해도 유지되어야 한다.

DBMS는 로그, 디스크 기록 등을 통해 이를 보장한다.

6. 자동 커밋(Auto Commit)

많은 DBMS는 기본적으로 자동 커밋 모드를 사용한다.

이 경우 SQL 문 하나가 실행될 때마다 자동으로 COMMIT된다.

여러 작업을 하나의 트랜잭션으로 묶고 싶다면, 자동 커밋을 끄고 명시적으로 트랜잭션을 관리해야 한다.

7. 트랜잭션 범위를 잘못 잡으면 생기는 문제

  • 트랜잭션이 너무 길면 락이 오래 유지된다
  • 동시 처리 성능이 떨어진다
  • 데드락 발생 가능성이 커진다

그래서 트랜잭션은 필요한 작업만 포함하도록 짧게 유지하는 것이 중요하다.

8. 정리

  • 트랜잭션은 여러 작업을 하나로 묶는 단위다
  • COMMIT은 확정, ROLLBACK은 취소다
  • ACID는 트랜잭션의 기본 성질이다
  • 트랜잭션 범위는 최소한으로 유지하는 것이 좋다