본문 바로가기
DBMS/SQL

[Database] 트랜잭션과 ACID 속성

by webcodur 2024. 3. 19.
728x90
반응형

 

목차

    <트랜잭션?>

    개념

    • DB시스템에서 완전성을 유지하기 위해 하나의 작업 단위로 처리되는 일련의 연산들
    • 모든 연산이 성공적으로 완료되어 DB가 일관된 상태를 유지하게 하거나, 실패할 경우 시작 전 상태로 롤백하여 DB의 안정성과 정확성을 보장한다.
    • DB관리의 핵심 개념 중 하나로, ACID 속성으로 요약된다.

    ACID 속성

    1. 원자성(Atomicity): 트랜잭션 내 모든 연산은 하나의 단위로 처리되어야 한다. 즉, 모든 연산이 성공적으로 완료되거나, 하나라도 실패할 경우 전체 트랜잭션이 취소되어야 한다.
    2. 일관성(Consistency): 트랜잭션이 성공적으로 완료되면, DB는 하나의 일관된 상태에서 다른 일관된 상태로 변해야 한다. 이는 트랜잭션 전후로 DB의 무결성 제약 조건이 유지되어야 함을 의미한다.
    3. 독립성(Isolation): 동시에 실행되는 여러 트랜잭션이 서로에게 영향을 주지 않아야 한다. 즉, 하나의 트랜잭션이 진행 중일 때 다른 트랜잭션의 중간 상태를 볼 수 없다.
    4. 지속성(Durability): 트랜잭션이 성공적으로 완료된 후에는, 그 결과로 시스템 장애가 발생하더라도 영구적으로 반영되어야 한다.

    트랜잭션의 주요 연산

    • Begin Transaction: 트랜잭션의 시작을 선언한다.
    • Commit: 트랜잭션이 성공적으로 완료되었음을 시스템에 알리고, 데이터베이스 변경사항을 영구적으로 저장한다.
    • Rollback: 트랜잭션 중에 오류가 발생하면, 변경사항을 취소하고 트랜잭션 시작 전 상태로 데이터베이스를 복원한다.

    트랜잭션 처리의 중요성

    트랜잭션 처리는 데이터의 일관성과 무결성을 유지하면서 동시성 제어와 데이터 복구를 가능하게 하는 DB 시스템의 중요한 기능이다. 특히, 금융 시스템, 예약 시스템 등 오류가 발생할 경우 큰 손실을 초래할 수 있는 시스템에서는 트랜잭션 처리의 중요성이 더욱 강조된다. 데이터의 정확성과 안정성을 보장하기 위해, 시스템 설계 시 트랜잭션 관리에 대한 충분한 고려가 필요하다.

     

     

     

     

    <예시>

    다음은 간단한 은행 계좌 이체를 예로들어 트랜잭션의 원자성, 일관성, 독립성, 지속성(ACID 속성)을 보여주는 과정이다

    상황

    A 계좌에서 B 계좌로 100만 원을 이체한다고 가정해보자. 이 과정에서 발생하는 주요 트랜잭션 연산은 다음과 같다:

    1. 트랜잭션 시작(Begin Transaction)
    2. A 계좌에서 100만 원 차감
    3. B 계좌에 100만 원 추가
    4. 트랜잭션 커밋(Commit) 또는 롤백(Rollback)

    과정 설명

    1. 트랜잭션 시작 (Begin Transaction)

    • 트랜잭션이 시작되며, 이체 작업이 한 작업 단위로 처리될 것임을 데이터베이스 관리 시스템(DBMS)에 알린다.

    2. A 계좌에서 100만 원 차감

    • A 계좌의 잔액을 확인하고, 100만 원을 차감한다. 이 때의 변경 사항은 아직 임시적이며, 트랜잭션이 완료되어 커밋되기 전까지 최종적으로 반영되지 않는다.

    3. B 계좌에 100만 원 추가

    • B 계좌의 잔액을 확인하고, 100만 원을 추가한다. A 계좌에서 차감된 금액이 B 계좌에 추가되는 것으로, 이 과정 역시 커밋 전까진 임시적이다.

    4. 트랜잭션 커밋(Commit) 또는 롤백(Rollback)

    • 모든 작업이 성공적으로 처리되면, 커밋 연산을 통해 변경 사항을 데이터베이스에 영구적으로 반영한다.
    • 만약 작업 중 오류가 발생하거나, A 계좌의 잔액이 부족한 경우처럼 트랜잭션을 정상적으로 완료할 수 없다면, 롤백 연산을 실행하여 모든 변경 사항을 취소하고 트랜잭션 시작 전 상태로 돌아간다.

    ACID 속성 적용

    • 원자성(Atomicity): A 계좌의 차감과 B 계좌의 추가가 모두 성공적으로 이루어지거나, 아니면 아무런 변경도 발생하지 않아야 한다(전부 실행되거나 전부 실행되지 않아야 한다).
    • 일관성(Consistency): 이체 후에도 두 계좌의 총액은 변하지 않아야 한다. 이는 데이터베이스의 무결성 제약을 유지한다. 무결성 제약 조건은 별도 페이지 참고
    • 독립성(Isolation): 이 트랜잭션이 진행되는 동안 다른 트랜잭션이 이 계좌들의 잔액을 조회하거나 변경할 수 없다.
    • 지속성(Durability): 트랜잭션이 한 번 커밋되면, 그 결과는 데이터베이스 장애가 발생하더라도 유지되어야 한다.

    이처럼 트랜잭션은 여러 단계의 연산을 포함할 수 있으며, ACID 속성을 통해 데이터의 일관성과 안정성을 보장한다.

     

    은행 계좌 이체 과정을 SQL 문을 사용해 표현하면 다음과 같다.

     

    (예시)

    • A 계좌의 ID : account_a,
    • B 계좌의 ID : account_b
    • 이체 금액 : 100만원
    -- 트랜잭션 시작
    BEGIN;
    
    -- A 계좌에서 100만 원 차감
    UPDATE accounts
    SET balance = balance - 1000000
    WHERE account_id = 'account_a';
    
    -- B 계좌에 100만 원 추가
    UPDATE accounts
    SET balance = balance + 1000000
    WHERE account_id = 'account_b';
    
    -- 잔액 확인 및 에러 처리 로직 (여기서는 간단히 표현)
    -- 예를 들어, A 계좌의 잔액이 음수가 되는 경우 롤백
    -- 실제로는 어플리케이션 코드에서 이러한 검사를 수행하고,
    -- 조건에 따라 COMMIT 또는 ROLLBACK을 결정
    
    -- 조건에 따라 트랜잭션 커밋 또는 롤백
    -- 모든 조건이 충족되면 커밋, 그렇지 않으면 롤백
    COMMIT;
    -- ROLLBACK; -- 필요한 경우 롤백

     

     

     

    <ACID가 깨진 경우의 상황들>

    다음은 ACID 속성 각각이 깨졌을 때 발생할 수 있는 예시나 상황을 표현한 것이다. 이러한 상황을 이해함으로써, ACID 속성이 데이터베이스 관리 시스템에서 왜 중요한지를 더욱 명확하게 파악할 수 있을 것이다.

    1. 원자성(Atomicity)이 깨진 경우

    • 상황: A 계좌에서 B 계좌로 송금 중, 금액을 A 계좌에서 차감한 후 시스템이 다운되어 B 계좌에 금액을 추가하지 못함.
    • 결과: A 계좌의 금액만 차감되고, B 계좌에는 추가되지 않아 돈이 '사라지는' 현상이 발생. 트랜잭션이 중간에 실패하여 원자성이 깨졌기 때문에 발생한 문제

    2. 일관성(Consistency)이 깨진 경우

    • 상황: 데이터베이스에서 나이를 나타내는 필드에 음수 값이 저장되는 오류.
    • 결과: 데이터베이스의 무결성 제약 조건을 위배하는 데이터가 저장되어, 데이터의 신뢰성과 정확성이 손상됨. 일관성이 보장되지 않으면, 데이터베이스의 상태가 불일치하게 됨.

    3. 독립성(Isolation)이 깨진 경우

    • 상황: 동시에 두 트랜잭션이 실행되는데, 하나의 트랜잭션이 아직 완료되지 않은 상태의 데이터를 다른 트랜잭션이 읽고 변경함.
    • 결과: '더티 리드(Dirty Read)'가 발생하여, 최종적으로 완료되지 않을 수 있는 데이터를 기반으로 잘못된 결정이나 계산이 이루어질 수 있음. 이는 데이터베이스의 일관된 상태도 보장할 수 없게 만든다.

    4. 지속성(Durability)이 깨진 경우

    • 상황: 트랜잭션이 성공적으로 완료되고 커밋되었지만, 시스템 장애로 인해 DB에 변경사항이 반영되지 않음.
    • 결과: 장애 발생 후 시스템 복구 시, 트랜잭션 완료에 따른 변경사항이 손실되어, 커밋된 데이터가 영구적으로 저장되지 않음. 이는 트랜잭션의 결과가 지속되지 않는 상황을 의미함.

    ACID 속성 중 하나라도 제대로 지켜지지 않을 경우, 데이터베이스의 신뢰성과 정확성이 크게 저하될 수 있다. 이러한 문제들을 방지하기 위해 데이터베이스 관리 시스템은 트랜잭션을 처리하며 ACID 속성을 엄격하게 유지해야 한다.

    반응형