2.17 Transaction

약 7분

본문 듣기
읽기 설정

글자 크기

줄 간격

글꼴

Data Consistency and Transactions

데이터베이스의 주요 기능 중 하나는 데이터의 일관성을 유지하는 것입니다. 이를 위해 "트랜잭션"이라는 개념이 필요합니다. 트랜잭션은 일련의 데이터베이스 작업이 "모두 성공하거나 모두 실패"하는 것을 보장하여 데이터의 일관성을 유지합니다.

예를 들어, 온라인 쇼핑몰에서 고객이 구매를 하였다고 가정해봅시다. 고객의 장바구니에서 상품을 구매할 때 다음과 같은 작업이 이루어집니다:

  1. 재고에서 상품 수량 감소
  2. 고객의 결제 정보 저장
  3. 주문 내역 기록

이 모든 작업이 성공적으로 완료되면, 트랜잭션이 성공적으로 종료됩니다. 그러나 만약 중간 과정에서 오류가 발생한다면, 모든 작업이 취소되어야 합니다. 이렇게 하지 않으면 데이터가 불일치하게 됩니다.

예제: 트랜잭션 시작 및 종료

MySQL에서 트랜잭션을 사용하기 위해서는 다음 세 가지 명령어를 사용할 수 있습니다:

  • START TRANSACTION: 트랜잭션을 시작합니다.
  • COMMIT: 모든 작업이 정상적으로 완료되면 변경사항을 저장합니다.
  • ROLLBACK: 오류 발생 시 트랜잭션을 취소하고 모든 변경 사항을 원래 상태로 되돌립니다.

간단한 트랜잭션 예제를 살펴보겠습니다:

데이터베이스 및 테이블 생성

먼저, 간단한 데이터베이스와 테이블을 생성합니다:

CREATE DATABASE shopDB;
USE shopDB;
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(50),
    stock INT
);
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

트랜잭션 예제

이제 트랜잭션을 사용하여 상품을 구매하는 과정을 구현해 보겠습니다:

START TRANSACTION;

INSERT INTO orders (product_id, quantity) VALUES (1, 2);
UPDATE products SET stock = stock - 2 WHERE product_id = 1;

COMMIT;

만약 제품의 재고가 부족하여 업데이트가 실패한다면, 다음과 같이 롤백을 수행할 수 있습니다:

START TRANSACTION;

INSERT INTO orders (product_id, quantity) VALUES (1, 2);
UPDATE products SET stock = stock - 2 WHERE product_id = 1;

-- 실패 조건을 시뮬레이션
IF (SELECT stock FROM products WHERE product_id = 1) < 0 THEN
    ROLLBACK;
ELSE
    COMMIT;
END IF;

실습

  1. 위의 예제를 바탕으로 트랜잭션을 사용하여 여러 개의 상품을 동시에 구매하는 SQL 흐름을 작성해보세요.
  2. 각 단계에서의 성공 혹은 실패를 체크하는 로직을 추가해보세요.

프로젝트

자신의 쇼핑몰 데이터베이스를 설계하고, 트랜잭션을 활용하여 장바구니에서 결제하는 기능을 구현해보세요. 장바구니에 담긴 상품의 수량을 조절하고, 잔여 재고를 기반으로 성공여부를 판단하는 로직을 추가하는 것이 중요합니다.

정리

트랜잭션을 통해 데이터베이스는 작업의 원자성을 보장할 수 있으며, 데이터의 일관성을 유지하는 데 큰 역할을 합니다. 이를 통해 복잡한 비즈니스 로직도 안정적으로 처리할 수 있습니다.트랜잭션 관련 실습과 예제를 통해, 보다 이해가 깊어질 것입니다.

코드 sql
CREATE DATABASE shopDB;
USE shopDB;
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(50),
    stock INT
);
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);
START TRANSACTION;
INSERT INTO orders (product_id, quantity) VALUES (1, 2);
UPDATE products SET stock = stock - 2 WHERE product_id = 1;
COMMIT;
START TRANSACTION;
INSERT INTO orders (product_id, quantity) VALUES (1, 2);
UPDATE products SET stock = stock - 2 WHERE product_id = 1;
IF (SELECT stock FROM products WHERE product_id = 1) < 0 THEN
    ROLLBACK;
ELSE
    COMMIT;
END IF;

댓글 0

댓글을 남기려면 로그인하세요.

아직 댓글이 없습니다. 첫 댓글을 남겨보세요.