본문으로 건너뛰기
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 미완료 상태