바이브 코딩 시대의 데이터베이스7-1 트랜잭션의 본질
테크타니 LEARN — 섹션 07 · 트랜잭션

트랜잭션의 본질 —
전부 성공하거나 전부 실패한다

무선 이어폰이 딱 하나 남았습니다. 고객이 주문 버튼을 눌렀고 화면에는 주문 완료가 떴어요. 그런데 재고는 그대로 1개입니다. 주문은 한 번 했는데 — 데이터는 반쪽만 맞는 상태로 남았습니다.

난이도보통소요8분준비물섹션 5 완료오늘ACID 를 주문 이야기로

이번 섹션의 여정

섹션 6 인덱스

완료 ✓

→
7-1 트랜잭션의 본질

지금 여기

→
7-2 언제 묶을까

작업 단위 찾기

→
7-3 COMMIT / ROLLBACK

확정하거나 되돌리기

SQL은 여러 개지만, 업무는 하나입니다

주문 한 건을 처리하려면 보통 여러 데이터가 바뀝니다.

주문하기 버튼 한 번 = 데이터 변경 세 개
무엇을어디에
누가 언제 주문했는지 저장orders
어떤 상품을 몇 개 샀는지 저장order_items
상품 재고를 줄이기products (재고 컬럼)
SQL 은 세 개지만 — 고객이 한 것은 '주문 한 번' 입니다
재고는 가상 예시입니다

우리 실습 shop DB 의 products 에는 재고 컬럼이 없습니다 (product_id · product_name · price · category_id 뿐이에요). 재고 차감은 트랜잭션을 설명하기 위한 가상의 예시입니다.

중간 작업에서 문제가 생겼는데 앞의 작업만 남는다면 세 테이블이 서로 다른 이야기를 하게 됩니다.

반쪽짜리 주문 — 이런 상태가 남으면 안 됩니다
주문 저장 ✓ 성공
주문상세 저장 ✓ 성공
재고 차감 ✕ 실패
 
→ 주문은 있는데 재고는 그대로. 누구의 기록이 맞을까?

이런 반쪽짜리 성공을 막기 위해 여러 SQL을 트랜잭션으로 묶습니다.

트랜잭션이라는 안전 상자

트랜잭션은 함께 처리할 SQL을 하나의 안전 상자에 넣는 것과 비슷합니다.

트랜잭션의 흐름
단계명령뜻
① 시작START TRANSACTION지금부터의 변경을 하나로 묶는다
② 변경INSERT · UPDATE · DELETE필요한 데이터를 바꾼다
③-A 확정COMMIT변경을 최종 반영한다
③-B 취소ROLLBACK시작 전 상태로 되돌린다
끝은 반드시 COMMIT 아니면 ROLLBACK — 둘 중 하나입니다
⭐ 트랜잭션의 핵심

SQL 의 개수가 아니라 — 함께 성공하고 함께 실패해야 하는 업무의 범위를 정하는 것입니다.

ACID — 트랜잭션의 네 가지 약속

트랜잭션에는 ACID라고 부르는 네 가지 약속이 있습니다. 영어 글자보다 뜻을 먼저 잡아볼게요.

ACID 를 주문 이야기로
글자이름뜻주문에서는
A원자성전부 반영하거나 전부 취소주문만 남고 재고는 그대로인 중간 상태를 허용하지 않는다
C일관성정해진 규칙을 지킨다작업이 끝난 뒤에도 재고가 음수가 되면 안 된다
I격리성동시 작업의 간섭을 줄인다두 고객이 동시에 마지막 상품을 주문해도 서로의 중간 작업을 방해하지 않는다
D지속성커밋한 결과를 보존한다주문 완료를 보여준 뒤 서버에 문제가 생겨도 기록이 사라지지 않는다

두 가지는 오해하기 쉬우니 짚고 가겠습니다.

C · 일관성 — 규칙은 우리가 정합니다

데이터베이스가 알아서 “말이 되는 값” 을 판단해 주는 게 아닙니다. 어떤 규칙을 지킬지는 우리가 제약조건(NOT NULL · CHECK · 외래키)과 프로그램으로 올바르게 정해야 해요. 섹션 3에서 배운 것들이 여기서 쓰입니다.

I · 격리성 — 한 줄로 세운다는 뜻이 아닙니다

모든 주문을 무조건 한 줄로 세워 하나씩 처리한다는 뜻이 아니에요. 동시에 처리하면서도 잘못된 결과가 생기지 않게 조절하는 약속입니다.

트랜잭션이 ‘정답’을 판단하지는 않습니다

여기서 아주 중요한 주의가 하나 있습니다.

⚠️ COMMIT 은 검사기가 아닙니다

커밋은 변경 내용이 맞는지 판단하지 않습니다. 우리가 만든 변경을 그대로 최종 확정할 뿐입니다.

재고를 1개 빼야 하는데 실수로 10개를 빼고 커밋하면 — 잘못된 값도 그대로 반영됩니다. 트랜잭션은 여러 작업을 하나로 묶어 주지만, 틀린 SQL을 고쳐 주는 기능은 아닙니다.

트랜잭션이 해주는 것과 해주지 않는 것
이건 해줍니다이건 안 해줍니다
중간에 실패하면 전부 되돌리기내가 쓴 SQL 이 업무적으로 맞는지 판단
커밋한 결과를 안전하게 보존WHERE 조건을 빠뜨린 실수 잡아내기
동시 작업의 간섭 조절잘못된 값을 올바른 값으로 교정
맞는지 확인하는 일은 — 여전히 사람의 몫입니다

한눈에 정리

개념한 줄 정의
트랜잭션여러 SQL 을 하나의 업무로 묶는 범위
COMMIT트랜잭션 안의 변경을 최종 반영
ROLLBACK트랜잭션 시작 전 상태로 되돌리기
A 원자성전부 반영하거나 전부 취소
C 일관성정해둔 규칙을 지킨 상태로 끝난다
I 격리성동시 작업이 서로를 망치지 않게 조절
D 지속성커밋한 결과는 장애가 나도 보존

여러 SQL이 하나의 업무라면 — 모두 커밋하거나, 문제가 있을 때 롤백해야 합니다.

그렇다면 어디부터 어디까지를 하나로 묶어야 할까요? 다음 강의에서 트랜잭션의 경계를 찾습니다.

NEXT LESSON7-2 언제 트랜잭션으로 묶을까 — 비즈니스 작업 단위 찾기

SQL 개수가 아니라 '함께 성공해야 하는 하나의 업무인가'로 시작과 끝을 정합니다.

GO ▸ 7-2 시작하기