Computer Science/DB

[DB] 트랜잭션

웅지니어링 2025. 2. 7. 11:24

* 트랜잭션(Transaction)이란?

트랜잭션은 데이터베이스에서 논리적인 작업의 단위를 의미한다. 여러 작업이 하나의 단일 작업처럼 수행되도록 보장하여 데이터의 일관성과 무결성을 유지하는 역할을 한다.

 

* 트랜잭션의 4가지 특성(ACID)

  • 원자성 (Atomicity)
    • 모든 작업이 완전히 수행되거나 전혀 수행되지 않아야 함
    • 중간에 오류가 발생하면 모든 작업이 롤백(Rollback)
    • 예: 송금 시, 돈을 보내는 작업과 받는 작업이 모두 성공하거나 둘 다 취소됨
  • 일관성 (Consistency)
    • 트랜잭션 전후로 데이터베이스의 상태가 일관되어야 함
    • 예: 은행 계좌에서 출금 후에도 총 잔액은 변하지 않음
  • 격리성 (Isolation)
    • 동시에 수행되는 트랜잭션이 서로 영향을 미치지 않도록 보장
    • 예: 두 사용자가 동시에 같은 상품을 구매해도 재고가 음수가 되지 않음
  • 지속성 (Durability)
    • 트랜잭션이 완료된 후에는 영구적으로 데이터베이스에 반영됨
    • 예: 주문 완료 후 시스템이 꺼져도 주문 기록은 유지됨

 

* 트랜잭션의 주요 연산

  • BEGIN / START TRANSACTION: 트랜잭션 시작
  • COMMIT: 모든 작업을 영구적으로 반영
  • ROLLBACK: 모든 작업을 취소하고 원래 상태로 복구

 

* 트랜잭션의 예시

START TRANSACTION;

-- 출금 처리
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 오류 확인
IF ROW_COUNT() = 0 THEN 
    ROLLBACK;
    SELECT 'Transaction failed. Rolled back.' AS message;
    LEAVE;
END IF;

-- 입금 처리
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 오류 확인
IF ROW_COUNT() = 0 THEN 
    ROLLBACK;
    SELECT 'Transaction failed. Rolled back.' AS message;
    LEAVE;
END IF;

COMMIT;
SELECT 'Transaction committed successfully.' AS message;

→ 계좌 간 송금을 하나의 트랜잭션으로 처리. 출금과 입금이 모두 성공해야만 COMMIT이 수행됨. 오류가 발생할 시, ROLLBACK되며 출금과 입금 모두 처리되지 않는다.

 

* 트랜잭션 격리 수준(Isolation Levels)

트랜잭션에는 트랜잭션 간의 간섭을 최소화하기 위한 격리 수준이 존재한다.

  • READ UNCOMMITTED
    • 다른 트랜잭션의 커밋되지 않은 데이터도 읽을 수 있음
    • 가장 낮은 격리 수준, 데이터 일관성 문제 발생 가능
  • READ COMMITTED
    • 커밋된 데이터만 읽을 수 있음
    • 대부분의 RDBMS에서 기본 격리 수준
  • REPEATABLE READ
    • 트랜잭션 동안 동일한 데이터는 동일하게 읽힘
    • 팬텀 읽기(Phantom Read) 문제 발생 가능
  • SERIALIZABLE
    • 가장 높은 격리 수준, 모든 트랜잭션을 직렬화하여 처리
    • 데이터 일관성은 보장되지만 성능 저하 발생

 

* 팬텀 읽기(Phantom Read)

팬텀 읽기는 일정 범위의 데이터를 여러 번 읽을 때, 첫 번째 쿼리에 없던 유령(Phantom) 데이터가 두 번째 쿼리에서는 나타나는 현상이다.

 

 

* 결론

  • 트랜잭션은 데이터베이스에서 논리적인 작업 단위로, ACID 특성을 만족시켜 데이터의 일관성과 무결성을 보장
  • COMMITROLLBACK으로 작업의 성공/실패를 관리
  • 트랜잭션의 격리 수준을 통해 동시성 제어 가능

'Computer Science > DB' 카테고리의 다른 글

[DB] PostgreSQL 설치 및 환경 설정  (0) 2021.09.21
[DB] SQL의 개념  (0) 2021.09.10
[DB] 데이터베이스의 개념  (0) 2021.09.10