208. 스케줄 (Schedule / History) - 트랜잭션 연산 실행 순서 병행 제어 인터리빙 직렬 비직렬 다중 프로그래밍 데이터 일관성
핵심 인사이트: 10만 명의 유저가 동시에 "결제!", "조회!", "송금!" 버튼을 미친 듯이 눌러댄다. 수백만 개의 쿼리(연산)가 데이터베이스 엔진으로 소나기처럼 쏟아진다. 이 수백만 개의 쿼리들을 한 줄로 세워서 차례대로 실행해야 하는데, A의 쿼리를 먼저 할까 B의 쿼리를 먼저 할까? A의 1번 쿼리를 하고 B의 1번 쿼리를 섞어서(인터리빙) 할까? "야! DB 엔진아, 수백만 개의 쿼리 조각들을 어떤 순서로 섞어서 CPU에 밀어 넣을지 거대한 '타임라인 스케줄표(시간표)'를 하나 작성해라! 이 시간표를 어떻게 미치도록 촘촘하고 예쁘게 짜느냐에 따라, 데이터가 모순되어 회사가 망할지 10만 명이 번개처럼 쇼핑을 끝낼지가 결정되잖아!!" 트랜잭션들의 운명이 적힌 거대한 교차로 신호등 시간표, 스케줄이다.
Ⅰ. 여러 트랜잭션의 충돌과 섞임 (Interleaving)
- 단일 코어 CPU에서는 2개의 쿼리가 완벽하게 같은 0.0001초에 실행될 수 없습니다.
- 트랜잭션 T1(출금 3줄)과 T2(조회 2줄)가 동시에 들어오면, DB 엔진은 T1과 T2의 쿼리를 아주 잘게 쪼개어 번갈아 가며 섞어서(인터리빙) 실행시킵니다. (예:
T1 1줄➜T2 1줄➜T1 2줄➜T2 2줄)
Ⅱ. 스케줄 (Schedule 또는 History)의 개념 🌟
- 개념: 데이터베이스 환경에서 다수의 트랜잭션이 동시에 실행될 때, 이 여러 트랜잭션을 구성하는 세부 연산(Read, Write)들이 CPU와 디스크에서 실제로 수행되는 거시적인 '순서(Sequence)의 나열'이자 전체 시간표를 의미합니다.
Ⅲ. 스케줄의 절대 룰 (트랜잭션 내부의 순서)
시간표를 아무리 맘대로 섞어 짜도 절대 어기면 안 되는 룰이 1개 있습니다.
- 내적 순서 보존 (Internal Order Preservation):
- 트랜잭션
T1안에1번 연산(읽기)과2번 연산(쓰기)이 순서대로 적혀있다고 칩시다. - 시간표(스케줄) 상에서
T1과T2를 아무리 현란하게 교차로 섞더라도,T1의 1번 연산은 반드시T1의 2번 연산보다 무조건 먼저 실행되도록 시간표 앞쪽에 박혀 있어야 합니다. (자기 뱃속에 있는 로직의 선후 관계가 역전되면 프로그램 자체가 에러를 뿜습니다.)
- 트랜잭션
Ⅳ. 스케줄 시간표의 3가지 극단적 모델 (스포일러) 🌟 핵심 🌟
시간표를 어떻게 짤지에 따라 3가지 아키텍처로 나뉩니다. 이 3가지는 209~211번 문서에서 가장 중요하게 파고들 핵심 기출 뼈대입니다.
- 직렬 스케줄 (Serial Schedule) - "모범생의 시간표" (209번)
- 교차(섞기)를 아예 금지합니다.
T1이 전부 다 끝날 때까지T2는 숨도 못 쉬고 대기합니다. 안정성 100%, 속도 0점의 거북이 스케줄입니다.
- 교차(섞기)를 아예 금지합니다.
- 비직렬 스케줄 (Non-serial Schedule) - "난장판 시간표" (210번)
T1과T2의 쿼리를 양념 반 후라이드 반처럼 미친 듯이 섞어서(교차 실행) 돌립니다. 속도 100%, 안정성 0점의 파멸적 스케줄(모순, 갱신 손실 폭발)입니다.
- 직렬 가능 스케줄 (Serializable Schedule) - "천재의 시간표" (211번) 🌟 궁극체 🌟
- 겉보기엔 양념 반 후라이드 반으로 섞어서(비직렬) 속도를 100% 챙겼는데, 연산 순서를 기가 막히게 교묘하게 섞어서 "최종적으로 데이터가 바뀐 결과물은 마치 직렬 스케줄(1명씩 순서대로 한 것)과 소름 돋게 100% 똑같이 나오는" 기적의 황금비율 안전 스케줄입니다. 모든 현대 DB 엔진이 목숨 걸고 지향하는 궁극의 타임라인입니다.
📢 섹션 요약 비유: 데이터베이스의 **스케줄(Schedule)**은 10만 명의 손님이 몰려든 놀이공원의 **'모든 놀이기구 탑승 순서표(타임라인)'**와 같습니다. 철수(트랜잭션 1)는 바이킹 ➜ 롤러코스터를 타야 하고, 영희(트랜잭션 2)는 롤러코스터 ➜ 회전목마를 타야 합니다. 놀이공원 매니저(DB 엔진)는 철수와 영희의 탑승 순서를 섞어서 거대한 시간표를 짭니다. 단, 철수가 바이킹을 타기 전에 롤러코스터를 타게 순서를 바꾸면 철수 계획표(내부 순서)가 망가지므로 그 순서는 킵해줘야 합니다. 매니저가 직렬 스케줄로 시간표를 짜면, 철수가 놀이공원 기구를 다 탈 때까지 영희는 밖에서 1시간 동안 기다려야 합니다(답답함 폭발). 매니저가 비직렬 스케줄로 시간표를 마구 섞으면 둘 다 동시에 빨리 타서 기분은 좋지만, 하필 철수와 영희가 롤러코스터 한 자리를 놓고 피 터지게 싸우다가 한 명이 튕겨 나가 다칩니다(갱신 손실, 모순성 에러). 이 혼돈의 교차로에서 수십만 명의 동선을 기가 막히게 섞어(인터리빙) 아무도 싸우지 않고 가장 빨리 집에 돌아가게 만드는, 눈에 보이지 않는 거대한 4차원 열차 배차표가 바로 트랜잭션 스케줄 덩어리입니다.