ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Mysql] 트랜잭션과 ACID 이해하기!
    DB/Mysql 2025. 4. 15. 15:51
    728x90
    반응형

    🔸 트랜잭션(Transaction)이란?

    트랜잭션이란, 하나의 작업 단위를 이루는 일련의 SQL 명령들의 집합입니다. 데이터베이스에서는 여러 작업이 모두 성공하거나, 모두 실패해야 일관성이 유지되기 때문에 트랜잭션이라는 개념이 중요합니다.

    예를 들어, 은행 계좌 이체를 생각해볼게요.

    -- A 계좌에서 1000원 출금
    UPDATE accounts SET balance = balance - 1000 WHERE user_id = 'A';
    
    -- B 계좌에 1000원 입금
    UPDATE accounts SET balance = balance + 1000 WHERE user_id = 'B';

    이 두 쿼리는 반드시 함께 성공하거나, 함께 실패해야 해요. 하나만 성공하고 다른 하나가 실패하면 돈이 사라지거나 두 배가 되겠죠? 그래서 트랜잭션으로 묶어서 처리합니다.

    START TRANSACTION;
    
    UPDATE accounts SET balance = balance - 1000 WHERE user_id = 'A';
    UPDATE accounts SET balance = balance + 1000 WHERE user_id = 'B';
    
    COMMIT; -- 모든 작업 성공 시
    -- ROLLBACK; -- 오류 발생 시 실행해서 모든 작업 취소

    🔸 트랜잭션의 ACID 속성

    트랜잭션은 ACID 네 가지 속성을 만족해야 합니다. 각각 MySQL 예제와 함께 알아볼게요.

    1️⃣ Atomicity (원자성)

    트랜잭션 내의 작업은 모두 성공하거나, 모두 실패해야 한다는 성질입니다.

    START TRANSACTION;
    
    UPDATE products SET stock = stock - 1 WHERE product_id = 1;
    INSERT INTO orders (user_id, product_id) VALUES (1, 1);
    
    -- 문제가 생기면 ROLLBACK
    ROLLBACK;
    
    -- 모든 작업이 성공했을 경우에만 COMMIT
    COMMIT;

    → 하나라도 실패하면 ROLLBACK으로 전체를 되돌립니다.

    2️⃣ Consistency (일관성)

    트랜잭션이 완료되면 데이터는 항상 일관성 있는 상태여야 합니다.

    예를 들어, 상품 재고(stock)가 줄었으면 주문 테이블에도 그 내역이 있어야죠. 이 둘이 불일치하면 데이터 무결성이 깨집니다.

    MySQL은 외래 키 제약 조건, 제약 조건 위반 시 오류 등을 통해 일관성을 유지하도록 도와줍니다.

    3️⃣ Isolation (고립성)

    동시에 실행되는 트랜잭션들이 서로에게 영향을 주지 않도록 격리되어야 합니다.

    예를 들어, 두 사용자가 동시에 같은 상품을 구매할 경우 아래처럼 처리합니다.

    -- 트랜잭션 A
    START TRANSACTION;
    SELECT stock FROM products WHERE product_id = 1;
    
    -- 트랜잭션 B
    START TRANSACTION;
    SELECT stock FROM products WHERE product_id = 1;

    이때 트랜잭션 격리 수준(예: REPEATABLE READ)에 따라 동일한 값을 보거나, 최신 값을 볼 수 있습니다. MySQL에서는 SET TRANSACTION ISOLATION LEVEL로 격리 수준을 설정할 수 있어요.

    4️⃣ Durability (지속성)

    트랜잭션이 커밋된 이후의 변경 사항은 영구적입니다. 시스템이 고장 나도 유지됩니다.

    START TRANSACTION;
    UPDATE accounts SET balance = balance - 1000 WHERE user_id = 'A';
    COMMIT;

    COMMIT이 완료되면 디스크에 기록되어 시스템 장애에도 데이터는 유지됩니다. MySQL은 로그 파일(InnoDB의 redo log 등)을 통해 지속성을 보장합니다.

    ✅ 마무리 요약

    속성 설명 MySQL 관련 기능/예시
    Atomicity 모두 성공 or 모두 실패 ROLLBACK, COMMIT
    Consistency 트랜잭션 전후의 상태가 일관성 유지 제약 조건, 외래 키 등
    Isolation 트랜잭션끼리 서로 영향 안 줌 격리 수준 설정 (READ COMMITTED 등)
    Durability COMMIT 후에는 영구 반영됨 로그 기록, 디스크 저장
    728x90
    반응형

    댓글

Designed by Tistory.