DB/Mysql

[Mysql] 트랜잭션과 ACID 이해하기!

hoonylab 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
반응형