반응형
MySQL에서 트랜잭션을 사용할 때 ROLLBACK 명령어는 전체 변경 사항을 되돌리는 데 사용된다.
하지만 경우에 따라 트랜잭션의 특정 시점까지만 되돌리고 싶을 때가 있다.
이럴 때 사용하는 명령어가 바로 ROLLBACK TO SAVEPOINT이다.

🔍 ROLLBACK TO SAVEPOINT란?
ROLLBACK TO SAVEPOINT는 트랜잭션 중간에 설정된 SAVEPOINT 지점까지 롤백하는 명령어이다.
즉, 전체 트랜잭션을 취소하는 것이 아니라, 지정한 포인트 이후의 작업만 되돌리는 부분 롤백 기능을 제공한다.
ROLLBACK TO SAVEPOINT 저장지점이름;
이 명령어는 MySQL의 고급 트랜잭션 제어 기능 중 하나이며, 복잡한 로직 처리 시 매우 유용하다.
특히 실무에서는 입력값 검증 실패, 중복 체크, 외래키 제약 오류 등 다양한 상황에서 SAVEPOINT + ROLLBACK TO 조합이 사용된다.
반응형
✅ 사용 전 확인 사항
- 반드시 START TRANSACTION이나 BEGIN으로 트랜잭션을 시작한 상태여야 한다.
- SAVEPOINT로 중간 지점을 지정해둔 상태에서만 사용할 수 있다.
- InnoDB 스토리지 엔진이어야 트랜잭션과 롤백이 적용된다.
- autocommit 모드는 반드시 꺼야 한다.
SET autocommit = 0;
START TRANSACTION;
SAVEPOINT sp1;
-- 중간 작업
ROLLBACK TO SAVEPOINT sp1;
🧪 실전 예제 1 – 중간 입력만 취소하고 앞 단계는 유지
SET autocommit = 0;
START TRANSACTION;
INSERT INTO customers (id, name) VALUES (1001, '이수연');
SAVEPOINT after_customer;
INSERT INTO orders (customer_id, amount) VALUES (1001, 120000);
-- 주문 처리 중 오류 발생 시
ROLLBACK TO SAVEPOINT after_customer;
-- 고객 정보는 유지되고 주문은 취소됨
COMMIT;
이 예제는 고객 등록은 유지하되, 주문 처리에서 문제가 생기면 해당 작업만 되돌리는 구조이다.
이처럼 ROLLBACK TO SAVEPOINT는 데이터 처리의 유연성과 안정성을 동시에 확보할 수 있게 한다.
🧪 실전 예제 2 – 중복 입력 체크 후 조건부 롤백
START TRANSACTION;
INSERT INTO products (id, name) VALUES (2001, '노트북');
SAVEPOINT product_inserted;
-- 동일 이름 제품이 이미 있을 경우
IF EXISTS (SELECT 1 FROM products WHERE name = '노트북' HAVING COUNT(*) > 1) THEN
ROLLBACK TO SAVEPOINT product_inserted;
END IF;
COMMIT;
이 예제는 제품 입력 후 중복 여부를 확인하여, 조건에 따라 입력 내용을 되돌리는 로직이다.
실무에서 중복 체크 + 롤백 로직은 데이터 정합성을 유지하는 데 필수이다.
반응형
🧪 실전 예제 3 – 여러 SAVEPOINT 조합 활용
START TRANSACTION;
INSERT INTO logs VALUES ('1단계 시작');
SAVEPOINT step1;
INSERT INTO logs VALUES ('2단계 시작');
SAVEPOINT step2;
-- 2단계 문제 발생
ROLLBACK TO SAVEPOINT step2;
-- 1단계는 그대로 유지됨
COMMIT;
복잡한 로직에서는 단계별 SAVEPOINT를 설정하고,
문제 발생 시 해당 지점까지만 롤백하여 최소한의 작업만 무효화할 수 있다.
🛠 관련 명령어 정리
명령어설명
| SAVEPOINT | 트랜잭션 중간 지점 저장 |
| ROLLBACK TO SAVEPOINT | 해당 지점까지 롤백 (그 이후만 취소됨) |
| RELEASE SAVEPOINT | 지정한 SAVEPOINT 제거 |
| ROLLBACK | 트랜잭션 전체 취소 |
ROLLBACK TO는 ROLLBACK과는 다르게, 이전 작업을 선택적으로 보존할 수 있는 점에서 매우 중요한 차이를 가진다.
반응형
⚠️ 주의사항
- ROLLBACK TO SAVEPOINT를 사용한 뒤에도 트랜잭션은 계속 유효하다.
반드시 COMMIT이나 ROLLBACK으로 최종 종료해야 한다. - 존재하지 않는 SAVEPOINT를 대상으로 ROLLBACK을 시도하면 에러가 발생한다.
- RELEASE SAVEPOINT를 한 이후에는 해당 지점으로 되돌릴 수 없다.
✅ 실무 활용 팁
- 조건문(예: IF EXISTS, CASE WHEN)과 함께 사용하면 강력한 데이터 제어 로직 구현 가능
- 저장 프로시저 또는 트리거 내부에서 단계별 오류 대응 처리에 적합
- 로그 테이블과 병행 사용 시 실패 작업 기록 + 복원 처리에 효과적
📌 요약
| 항목 | 내용 |
| 명령어 | ROLLBACK TO SAVEPOINT |
| 기능 | 특정 지점까지 부분 롤백 |
| 활용 예 | 중간 오류 처리, 단계적 입력 처리, 조건부 취소 |
| 주의사항 | SAVEPOINT가 존재해야 사용 가능, COMMIT로 마무리 필요 |
📎 공식 문서 참고
반응형
'DB' 카테고리의 다른 글
| [MySQL] INSERT 다중 행 삽입 사용법 완벽 가이드 (1) | 2025.06.19 |
|---|---|
| [MySQL] INSERT 기본 사용법 완벽 가이드 (0) | 2025.06.19 |
| [MySQL] SET autocommit = 0/1 완벽 가이드 사용법(오토커밋 설정) (2) | 2025.06.18 |
| [MySQL] RELEASE SAVEPOINT 완벽 가이드 사용법(SAVEPOINT 삭제) (0) | 2025.06.18 |
| [MySQL] SAVEPOINT 완벽 가이드 사용법(트랜잭션 중간 지점 저장) (1) | 2025.06.17 |
| [MySQL] ROLLBACK 완벽 가이드 사용법(변경사항 취소) (0) | 2025.06.17 |
| [MySQL] COMMIT 완벽 가이드 사용법(변경사항 확정) (0) | 2025.06.17 |
| [MySQL] BEGIN 완벽 가이드 사용법(트랜잭션 시작) (0) | 2025.06.17 |