MySQL **트랜잭션(Transaction)**은 여러 SQL 작업을 하나의 작업 단위로 묶어서모두 성공하거나, 하나라도 실패하면 전부 취소(Rollback) 되도록 보장하는 기능입니다.
1️⃣ 트랜잭션이란?
트랜잭션은 다음 4가지 성질(ACID)을 가집니다.
🔹 ACID 특징
Atomicity (원자성) 전부 성공하거나 전부 실패 Consistency (일관성) 트랜잭션 전·후 데이터 규칙 유지
Isolation (격리성) 동시에 실행돼도 서로 간섭 없음 Durability (지속성) 커밋된 데이터는 영구 저장
2️⃣ 트랜잭션이 필요한 상황
✔ 계좌 이체
✔ 주문 + 결제 + 재고 감소
✔ 여러 테이블을 동시에 수정할 때
예: 돈은 빠졌는데 입금은 안 되는 상황 ❌
3️⃣ 기본 트랜잭션 문법
START TRANSACTION; -- 또는 BEGIN;
SQL문 1;
SQL문 2;
COMMIT; -- 성공 시
-- 또는
ROLLBACK; -- 실패 시
4️⃣ 예제 1: 계좌 이체계좌 테이블
CREATE TABLE account (
id INT PRIMARY KEY,
balance INT
);
트랜잭션 사용
START TRANSACTION;
UPDATE account
SET balance = balance - 1000
WHERE id = 1;
UPDATE account
SET balance = balance + 1000
WHERE id = 2;
COMMIT;
❌ 중간에 오류 발생 시
ROLLBACK;
5️⃣ 예제 2: 주문 처리 (실전 예)테이블 구조
orders(id, user_id, total_price)
order_items(order_id, product_id, qty)
products(id, stock)
트랜잭션 처리
START TRANSACTION;
-- 주문 생성
INSERT INTO orders(user_id, total_price)
VALUES (1, 50000);
SET @order_id = LAST_INSERT_ID();
-- 주문 상품 추가
INSERT INTO order_items(order_id, product_id, qty)
VALUES (@order_id, 10, 2);
-- 재고 감소
UPDATE products
SET stock = stock - 2
WHERE id = 10;
COMMIT;
❗ 재고 부족 등 오류 발생 시
ROLLBACK;
6️⃣ 자동 커밋(Auto Commit)
MySQL은 기본적으로 자동 커밋 ON 상태입니다.
자동 커밋 확인
SELECT @@autocommit;
자동 커밋 끄기
SET autocommit = 0;
7️⃣ 트랜잭션 주의사항
🚨 반드시 InnoDB 엔진 사용
SHOW TABLE STATUS WHERE Name = 'account';
ENGINE=InnoDB;
MyISAM ❌ → 트랜잭션 지원 안 함
8️⃣ PHP / MySQL 트랜잭션 예제
$conn->beginTransaction();
try {
$conn->exec("UPDATE account SET balance = balance - 1000 WHERE id = 1");
$conn->exec("UPDATE account SET balance = balance + 1000 WHERE id = 2");
$conn->commit();
} catch (Exception $e) {
$conn->rollBack();
}
9️⃣ 트랜잭션 격리 수준 (중요)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
READ UNCOMMITTED 더티 리드 발생
READ COMMITTED 커밋된 데이터만 REPEATABLE READ MySQL 기본값 SERIALIZABLE 가장 안전, 느림
🔥 요약
✔ 여러 SQL을 하나로 묶을 때 사용
✔ 실패 시 ROLLBACK
✔ 성공 시 COMMIT
✔ InnoDB 필수