Learning
레슨 6 / 8·20분

트랜잭션과 제약조건

트랜잭션(Transaction)이란?

트랜잭션은 하나의 논리적 작업 단위를 구성하는 SQL 문들의 묶음입니다. 은행 이체처럼 여러 작업이 모두 성공하거나 모두 실패해야 하는 경우에 사용합니다. ACID 속성(원자성, 일관성, 고립성, 지속성)을 보장합니다.

트랜잭션 사용법

sql
-- 기본 트랜잭션
START TRANSACTION;

-- 계좌 A에서 10000원 출금
UPDATE accounts
SET balance = balance - 10000
WHERE account_id = 1001;

-- 계좌 B에 10000원 입금
UPDATE accounts
SET balance = balance + 10000
WHERE account_id = 1002;

-- 모두 성공하면 확정
COMMIT;

-- 문제 발생 시 되돌리기
-- ROLLBACK;
sql
-- SAVEPOINT 활용
START TRANSACTION;

INSERT INTO orders (customer_id, total)
VALUES (1, 50000);

SAVEPOINT after_order;

INSERT INTO order_items (order_id, product_id, quantity)
VALUES (LAST_INSERT_ID(), 101, 2);

-- 아이템 삽입에 문제가 있으면 주문까지만 롤백
-- ROLLBACK TO after_order;

COMMIT;

제약조건(Constraints)

sql
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT NOT NULL,
    order_date DATE NOT NULL DEFAULT (CURRENT_DATE),
    total DECIMAL(10, 2) CHECK (total >= 0),
    status VARCHAR(20) DEFAULT 'pending',

    -- 외래 키 제약조건
    FOREIGN KEY (customer_id)
        REFERENCES customers(id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

CREATE TABLE order_items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT CHECK (quantity > 0),
    price DECIMAL(10, 2) NOT NULL,

    -- 복합 유니크 제약조건
    UNIQUE (order_id, product_id),

    FOREIGN KEY (order_id) REFERENCES orders(id)
        ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id)
        ON DELETE RESTRICT
);

제약조건 종류 정리

  • PRIMARY KEY — 기본 키, NOT NULL + UNIQUE, 테이블당 하나
  • FOREIGN KEY — 외래 키, 다른 테이블의 PRIMARY KEY 참조
  • NOT NULL — NULL 값 허용하지 않음
  • UNIQUE — 중복 값 허용하지 않음 (NULL은 여러 개 가능)
  • CHECK — 값의 범위나 조건을 제한
  • DEFAULT — 값을 지정하지 않으면 기본값 사용
  • ON DELETE CASCADE — 부모 삭제 시 자식도 삭제
  • ON DELETE RESTRICT — 자식이 있으면 부모 삭제 불가
💡

ACID 속성: Atomicity(원자성 - 전부 성공 or 전부 실패), Consistency(일관성 - 규칙 유지), Isolation(고립성 - 동시 트랜잭션 격리), Durability(지속성 - 커밋 후 영구 저장). 데이터 무결성의 핵심입니다.