트랜잭션의 본질 —
전부 성공하거나 전부 실패한다
무선 이어폰이 딱 하나 남았습니다. 고객이 주문 버튼을 눌렀고 화면에는 주문 완료가 떴어요. 그런데 재고는 그대로 1개입니다. 주문은 한 번 했는데 — 데이터는 반쪽만 맞는 상태로 남았습니다.
이번 섹션의 여정
완료 ✓
지금 여기
작업 단위 찾기
확정하거나 되돌리기
SQL은 여러 개지만, 업무는 하나입니다
주문 한 건을 처리하려면 보통 여러 데이터가 바뀝니다.
| 무엇을 | 어디에 |
|---|---|
| 누가 언제 주문했는지 저장 | orders |
| 어떤 상품을 몇 개 샀는지 저장 | order_items |
| 상품 재고를 줄이기 | products (재고 컬럼) |
우리 실습 shop DB 의 products 에는 재고 컬럼이 없습니다
(product_id · product_name · price · category_id 뿐이에요). 재고 차감은
트랜잭션을 설명하기 위한 가상의 예시입니다.
중간 작업에서 문제가 생겼는데 앞의 작업만 남는다면 세 테이블이 서로 다른 이야기를 하게 됩니다.
이런 반쪽짜리 성공을 막기 위해 여러 SQL을 트랜잭션으로 묶습니다.
트랜잭션이라는 안전 상자
트랜잭션은 함께 처리할 SQL을 하나의 안전 상자에 넣는 것과 비슷합니다.
| 단계 | 명령 | 뜻 |
|---|---|---|
| ① 시작 | START TRANSACTION | 지금부터의 변경을 하나로 묶는다 |
| ② 변경 | INSERT · UPDATE · DELETE | 필요한 데이터를 바꾼다 |
| ③-A 확정 | COMMIT | 변경을 최종 반영한다 |
| ③-B 취소 | ROLLBACK | 시작 전 상태로 되돌린다 |
SQL 의 개수가 아니라 — 함께 성공하고 함께 실패해야 하는 업무의 범위를 정하는 것입니다.
ACID — 트랜잭션의 네 가지 약속
트랜잭션에는 ACID라고 부르는 네 가지 약속이 있습니다. 영어 글자보다 뜻을 먼저 잡아볼게요.
| 글자 | 이름 | 뜻 | 주문에서는 |
|---|---|---|---|
| A | 원자성 | 전부 반영하거나 전부 취소 | 주문만 남고 재고는 그대로인 중간 상태를 허용하지 않는다 |
| C | 일관성 | 정해진 규칙을 지킨다 | 작업이 끝난 뒤에도 재고가 음수가 되면 안 된다 |
| I | 격리성 | 동시 작업의 간섭을 줄인다 | 두 고객이 동시에 마지막 상품을 주문해도 서로의 중간 작업을 방해하지 않는다 |
| D | 지속성 | 커밋한 결과를 보존한다 | 주문 완료를 보여준 뒤 서버에 문제가 생겨도 기록이 사라지지 않는다 |
두 가지는 오해하기 쉬우니 짚고 가겠습니다.
데이터베이스가 알아서 “말이 되는 값” 을 판단해 주는 게 아닙니다. 어떤
규칙을 지킬지는 우리가 제약조건(NOT NULL · CHECK · 외래키)과 프로그램으로
올바르게 정해야 해요. 섹션 3에서 배운 것들이 여기서 쓰입니다.
모든 주문을 무조건 한 줄로 세워 하나씩 처리한다는 뜻이 아니에요. 동시에 처리하면서도 잘못된 결과가 생기지 않게 조절하는 약속입니다.
트랜잭션이 ‘정답’을 판단하지는 않습니다
여기서 아주 중요한 주의가 하나 있습니다.
커밋은 변경 내용이 맞는지 판단하지 않습니다. 우리가 만든 변경을 그대로 최종 확정할 뿐입니다.
재고를 1개 빼야 하는데 실수로 10개를 빼고 커밋하면 — 잘못된 값도 그대로 반영됩니다. 트랜잭션은 여러 작업을 하나로 묶어 주지만, 틀린 SQL을 고쳐 주는 기능은 아닙니다.
| 이건 해줍니다 | 이건 안 해줍니다 |
|---|---|
| 중간에 실패하면 전부 되돌리기 | 내가 쓴 SQL 이 업무적으로 맞는지 판단 |
| 커밋한 결과를 안전하게 보존 | WHERE 조건을 빠뜨린 실수 잡아내기 |
| 동시 작업의 간섭 조절 | 잘못된 값을 올바른 값으로 교정 |
한눈에 정리
| 개념 | 한 줄 정의 |
|---|---|
| 트랜잭션 | 여러 SQL 을 하나의 업무로 묶는 범위 |
| COMMIT | 트랜잭션 안의 변경을 최종 반영 |
| ROLLBACK | 트랜잭션 시작 전 상태로 되돌리기 |
| A 원자성 | 전부 반영하거나 전부 취소 |
| C 일관성 | 정해둔 규칙을 지킨 상태로 끝난다 |
| I 격리성 | 동시 작업이 서로를 망치지 않게 조절 |
| D 지속성 | 커밋한 결과는 장애가 나도 보존 |
여러 SQL이 하나의 업무라면 — 모두 커밋하거나, 문제가 있을 때 롤백해야 합니다.
그렇다면 어디부터 어디까지를 하나로 묶어야 할까요? 다음 강의에서 트랜잭션의 경계를 찾습니다.