COMMIT·ROLLBACK과 ACID, 격리 수준으로 데이터 일관성을 지킨다.
트랜잭션과 동시성
계좌 이체는 "A에서 출금"과 "B에 입금"이 모두 성공하거나 모두 실패해야 합니다. 하나만 되면 돈이 사라집니다. 여러 작업을 하나의 단위로 묶어 전부 성공 또는 전부 취소되게 보장하는 것이 트랜잭션입니다.
학습 목표
START TRANSACTION/COMMIT/ROLLBACK으로 트랜잭션을 다룹니다.- ACID 네 가지 성질을 이해합니다.
- 격리 수준과 그에 따른 이상 현상을 구분합니다.
- 락(잠금)의 기본 개념을 이해합니다.
트랜잭션 기본
START TRANSACTION;
UPDATE accounts SET balance = balance - 10000 WHERE id = 1; -- 출금
UPDATE accounts SET balance = balance + 10000 WHERE id = 2; -- 입금
COMMIT; -- 둘 다 성공 → 확정
중간에 문제가 생기면 ROLLBACK 으로 시작 시점으로 되돌립니다.
START TRANSACTION;
UPDATE accounts SET balance = balance - 10000 WHERE id = 1;
-- 잔액 부족 등 문제 발견
ROLLBACK; -- 모든 변경 취소
💡 TIP — MySQL은 기본적으로
autocommit이 켜져 있어 각 문장이 즉시 확정됩니다. 여러 문장을 묶으려면START TRANSACTION(또는BEGIN)으로 명시적으로 시작하세요. 트랜잭션은 InnoDB 엔진에서 동작합니다.
ACID — 트랜잭션의 4대 성질
| 성질 | 의미 |
|---|---|
| Atomicity(원자성) | 전부 성공 또는 전부 실패 |
| Consistency(일관성) | 제약조건을 항상 만족 |
| Isolation(격리성) | 동시에 실행돼도 서로 간섭 없음 |
| Durability(지속성) | 커밋된 결과는 장애에도 보존 |
격리 수준
여러 트랜잭션이 동시에 같은 데이터를 다루면 서로 영향을 줄 수 있습니다. 격리 수준은 어디까지 간섭을 허용할지 정합니다.
| 격리 수준 | Dirty Read | Non-repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 발생 | 발생 | 발생 |
| READ COMMITTED | 차단 | 발생 | 발생 |
| REPEATABLE READ | 차단 | 차단 | 차단* |
| SERIALIZABLE | 차단 | 차단 | 차단 |
- Dirty Read: 아직 커밋 안 된 남의 변경을 읽음
- Non-repeatable Read: 같은 행을 두 번 읽었는데 값이 달라짐
- Phantom Read: 같은 조건으로 다시 조회했더니 행 수가 달라짐
MySQL(InnoDB)의 기본 격리 수준은 REPEATABLE READ 이며, 갭 락 덕분에 팬텀 리드도 대부분 막아 줍니다(* 표시).
-- 현재 세션의 격리 수준 변경
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
락 — 잠금
여러 트랜잭션이 같은 행을 동시에 바꾸지 못하게 막는 장치가 락입니다. InnoDB는 행 단위 잠금(row-level lock)을 사용해, 다른 행을 건드리는 트랜잭션끼리는 서로 기다리지 않습니다.
-- 조회하면서 해당 행을 잠가 다른 트랜잭션이 수정하지 못하게
START TRANSACTION;
SELECT * FROM products WHERE id = 1 FOR UPDATE; -- 쓰기 잠금
UPDATE products SET stock = stock - 1 WHERE id = 1;
COMMIT;
⚠️ 주의 — 두 트랜잭션이 서로가 가진 락을 기다리면 영원히 멈추는 데드락이 발생합니다. InnoDB는 이를 감지해 한쪽을 자동으로 롤백합니다. 여러 행을 잠글 때는 모든 트랜잭션이 같은 순서로 접근하도록 맞추면 데드락을 줄일 수 있습니다.
요약
- 트랜잭션은 여러 작업을 묶어
COMMIT(확정) 또는ROLLBACK(취소)합니다. - ACID는 원자성·일관성·격리성·지속성을 보장합니다.
- 격리 수준이 낮을수록 빠르지만 이상 현상이 늘어납니다.
- MySQL 기본은 REPEATABLE READ이며 InnoDB에서 동작합니다.
- 락은 동시 수정을 막고, 데드락은 접근 순서를 맞춰 예방합니다.
연습문제
- id 1의 잔액을 5000 줄이고 id 2의 잔액을 5000 늘리는 이체를 트랜잭션으로 작성하세요.
- 트랜잭션 도중 변경을 취소하는 명령은 무엇인가요?
- 현재 세션의 격리 수준을 READ COMMITTED로 바꾸는 명령을 작성하세요.
- 재고 차감 전에 해당 상품 행을 잠그는 조회 쿼리를 작성하세요.
힌트 — 1번은
START TRANSACTION ... COMMIT, 2번은ROLLBACK, 4번은SELECT ... FOR UPDATE.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MySQL” 강좌에 대한 댓글입니다.