200. SAVEPOINT - 트랜잭션 내 중간 복구 지점 설정 세이브포인트 부분 롤백 ROLLBACK TO TCL 트랜잭션 성능 최적화 대규모 연산 제어
핵심 인사이트: (199번 ROLLBACK 심화) 엑셀에 10만 명의 월급 데이터를 입력하고 있다. 9만 9천 명까지 입력했는데, 마지막 1명의 이름에서 오타(에러)가 났다. 199번에서 배운 무식한
ROLLBACK을 쾅 치면? 엑셀 파일이 내가 맨 처음 1번 직원을 치기 전의 백지상태로 초기화된다! 미친 짓이다! 내가 3일 동안 친 9만 9천 명의 데이터가 한 방에 날아간다! "야!! 에러 났다고 무식하게 아예 태초마을(시작점)로 전부 다 돌려버리지 마! 1만 명 입력할 때마다 엑셀에 몰래 '깃발(임시 저장 지점)'을 꽂아둬라! 마지막에 에러 나면 아예 싹 다 지우지 말고, 가장 최근에 꽂아둔 '9만 명째 깃발' 시점까지만 살짝 부분 롤백(되감기)을 해서, 내가 개고생한 9만 명의 피땀 눈물을 살려내라고!!" 거대한 트랜잭션의 억울한 파멸을 막아주는 안전망, 세이브포인트(SAVEPOINT)다.
Ⅰ. 무식한 전체 ROLLBACK의 피눈물 나는 딜레마
- 트랜잭션의 대원칙 원자성(193번)은 "모 아니면 도"입니다. 에러가 하나라도 나면 수백만 건의 이전 성공 쿼리들까지 싹 다 취소하고 태초 상태(BEGIN 시점)로 롤백해야 합니다.
- 초대형 배치(Batch) 작업의 딜레마: 통신사에서 새벽에 1,000만 명의 요금 정산 트랜잭션을 1개의 덩어리로 돌립니다. 999만 명 성공하고 딱 1명 에러 났다고 1,000만 명을 다 ROLLBACK 시키면, 밤을 새워도 정산 시스템이 끝나지 않는 미친 비효율(오버헤드 폭발)이 발생합니다.
Ⅱ. SAVEPOINT (세이브포인트)의 개념 🌟
- 개념: 거대하고 긴 트랜잭션(Transaction) 덩어리를 쪼개어, 개발자가 코드의 중간중간 원하는 특정 구간마다 임시 복구 지점(책갈피/깃발)을 꽂아 두고, 나중에 문제가 터졌을 때 트랜잭션 전체를 취소(태초마을행)하지 않고 '딱 그 깃발 꽂은 지점(특정 시점)까지만' 살짝 되감아서 부분 롤백(Partial Rollback)할 수 있게 해주는 정밀 제어 TCL 명령어입니다.
Ⅲ. SAVEPOINT 작동 메커니즘과 문법 (어떻게 되감나?) 🌟 핵심 🌟
자바나 스프링 코딩 시 대용량 엑셀 업로드 짤 때 필수 스킬입니다.
1. 깃발 꽂기 (명령어 생성)
- 쿼리 사이사이에 이름을 붙여 깃발을 꽂습니다.
SAVEPOINT A;(1만 건 처리 후 책갈피 A 꽂음)SAVEPOINT B;(2만 건 처리 후 책갈피 B 꽂음)- 이제 이 책갈피 시점의 199번 Undo Log(과거 데이터 상태)가 독립적으로 딱딱 라벨링 되어 백업됩니다.
2. 타겟팅 부분 롤백 (ROLLBACK TO) 🌟 기출 단골
- 3만 건째를 돌리다 치명적 에러가 펑 터졌습니다!
- 그냥
ROLLBACK;을 치면 0건 시점(태초)으로 다 날아갑니다. ROLLBACK TO B;라고 핀셋 롤백을 때립니다!!- 결과: 기적이 일어납니다. 방금 에러 났던 3만 건짜리 작업부터 깃발 B 사이의 흔적만 깔끔하게 지워버리고(부분 취소), 깃발 B 이전에 쳐놨던 2만 건의 귀중한 성공 데이터(A와 B까지의 작업)는 메모리에 고스란히 살아서 유지됩니다.
3. 깃발의 휘발성 (주의점)
- "오! 깃발 B로 타임머신 탔네? 다시 깃발 A로 또 가볼까?
ROLLBACK TO A;" (가능합니다. 뒤로 더 가는 건 됩니다.) - "앗 너무 뒤로 갔네? 다시 깃발 B로 돌아가자!
ROLLBACK TO B;" - 절대 불가! 타임머신을 타고 과거(A)로 돌아가 버리는 순간, 미래에 꽂혀있던 B 깃발은 시간의 역설에 휩쓸려 허공으로 파괴(소멸)되어 버립니다. (미래로 가는 롤백은 우주에 없습니다.)
- 또한 트랜잭션이 최종적으로
COMMIT을 때려 디스크에 영구 확정되는 순간, 이 트랜잭션 안에서 꽂아놨던 A, B, C 수백 개의 깃발도 싹 다 쓸모없어져 일제히 소멸해 버립니다.
Ⅳ. 왜 이게 실무에서 신의 기술인가? (중첩 트랜잭션)
- A 모듈을 돌리다가 B 모듈(다른 함수)을 짬뽕으로 불러서 써야 하는 복잡한 로직(Nested Transaction)에서 빛을 발합니다.
- B 모듈 안에서 에러가 터졌을 때, 메인 뼈대인 A 모듈까지 다 롤백시켜버리면 회사가 마비됩니다.
- B 모듈이 시작할 때
SAVEPOINT를 몰래 꽂아두면, B 모듈만 에러 났을 때 딱 B 모듈이 싼 똥만ROLLBACK TO로 치워버리고, A 모듈의 메인 흐름은 무사히 살려서COMMIT까지 부드럽게 완수하게 해주는 초정밀 예외 처리(Exception Handling)의 코어 엔진입니다.
📢 섹션 요약 비유: 단순한 전체 ROLLBACK이 오락실 아케이드 게임처럼 보스전에서 죽으면 동전이 까이고 **'아예 스테이지 1 처음부터 미친 듯이 다시 깨야 하는 극악의 난이도'**라면, SAVEPOINT(세이브포인트) 명령어는 집에서 하는 RPG 게임의 **'중간 세이브(Save) 지점'**입니다. 보스 방(거대한 트랜잭션)으로 가는 길이 너무 길고 험난해서(수만 줄의 쿼리), 플레이어(개발자)는 1층 입구, 5층 계단, 보스 방문 앞에 각각 빛나는 세이브 깃발(SAVEPOINT A, B, C)을 꾹꾹 박아둡니다. 보스랑 싸우다가 칼을 맞고 죽었습니다(에러 발생). 플레이어는 눈물을 흘리며 태초 마을(1층)로 돌아가지 않습니다!
ROLLBACK TO C버튼을 눌러, 방금 꽂았던 보스 방문 앞(깃발 C 시점)에서 체력을 풀로 채워 0.1초 만에 깔끔하게 부활합니다. 그 앞의 5층 1층까지 올라오며 주웠던 아이템과 경험치(이전 성공 쿼리들)는 내 주머니에 완벽하게 살아있습니다. 한 번의 실수로 개고생한 모든 작업이 허공에 증발하는(원자성의 융통성 없는 폭력) 비극을 막고, 딱 실패한 그 특정 구간의 배설물만 핀셋으로 도려내어 태워버리는 마법의 중간 복원 책갈피입니다.