본문으로 건너뛰기
SQL 기초집LESSON 21

트랜잭션과 ACID

난이도입문 → 초급
예상 시간30분
선수지식이전 강의

21강. 트랜잭션과 ACID

1. 이번 강의에서 해결할 문제

경기 결과는 저장됐지만 캐릭터 통계가 실패하면 서로 모순된 데이터가 남습니다. 함께 성공해야 하는 변경을 하나의 트랜잭션으로 묶습니다.

2. 학습 목표

3. 핵심 개념

ACID는 트랜잭션이 전부 성공하거나 전부 실패하고, 제약을 지키며, 동시 작업과 격리되고, 커밋 후 유지되는 성질을 말합니다. SQLite는 여러 동시 읽기를 지원하지만 동시에 하나의 write transaction만 진행합니다. PostgreSQL은 MVCC와 격리 수준을 통해 다중 사용자 서버 동시성을 다룹니다.

4. 단계별 SQL 예시

위험도: 두 테이블에 데이터 추가. 실습 DB 백업 후 실행
대상 테이블: match_results, character_stats
파일 경로: C:\dev\game-ranking-db\sql\21-transaction.sql

sql/21-transaction.sql
PRAGMA foreign_keys = ON;
BEGIN IMMEDIATE;

INSERT INTO match_results (
game_id, player_id, score, result, rank_position
) VALUES (3, 3, 1180, 'win', 1);

INSERT INTO character_stats (
result_id, character_name, damage_dealt, healing_done
) VALUES (last_insert_rowid(), 'Archer', 5900, 0);

-- COMMIT 전에 두 행이 정확히 연결됐는지 검증
SELECT mr.result_id, mr.game_id, mr.player_id, cs.character_name
FROM match_results AS mr
JOIN character_stats AS cs ON cs.result_id = mr.result_id
WHERE mr.game_id = 3 AND mr.player_id = 3;

COMMIT;
PowerShell · 실행 순서
Copy-Item .\data\game_ranking.db .\data\game_ranking.before-transaction.db
sqlite3 -header -box .\data\game_ranking.db ".read .\sql\21-transaction.sql"

연습할 때 두 번째 INSERT의 damage를 -1로 바꾸면 CHECK 오류가 납니다. CLI에서 즉시 ROLLBACK;해 첫 INSERT도 취소합니다.

5. 쿼리가 동작하는 이유

BEGIN IMMEDIATE는 SQLite 쓰기 예약을 일찍 획득해 뒤늦은 잠금 실패를 줄입니다. last_insert_rowid()는 같은 연결에서 직전 자동 생성 키를 가져옵니다. COMMIT 전 검증이 맞지 않으면 ROLLBACK할 수 있습니다.

6. 자주 하는 실수와 안전한 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

트랜잭션과 ACID 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1다음 중 “트랜잭션과 ACID”의 핵심 요약을 실제 상황에 맞게 적용한 것은 무엇인가요?
  2. 문제 2“트랜잭션과 ACID” 실습 중 ‘오류 후 열린 트랜잭션을 방치’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

21강. 트랜잭션과 ACID 미완료 상태