DB

[MySQL] SAVEPOINT 완벽 가이드 사용법(트랜잭션 중간 지점 저장)

인생아 2025. 6. 17. 16:58
반응형

MySQL 트랜잭션을 사용하면 ROLLBACK으로 전체 작업을 되돌릴 수 있다.
그런데 모든 작업을 되돌리는 것이 아니라, 일부 작업만 선택적으로 취소하고 싶을 때는 어떻게 해야 할까?
바로 그때 사용하는 명령어가 SAVEPOINT이다.

🔍 SAVEPOINT 명령어란?

SAVEPOINT는 트랜잭션 내부에서 중간 지점을 저장하는 명령어이다.
트랜잭션 중간에 SAVEPOINT를 설정해두면, 이후 작업 중 문제가 생겼을 때 해당 지점까지만 롤백할 수 있다.

즉, 전체 작업이 아닌 특정 단계까지만 되돌릴 수 있게 해주는 부분 ROLLBACK을 위한 필수 명령어이다.

SAVEPOINT 지점이름;

하나의 트랜잭션 내에 여러 개의 SAVEPOINT를 설정할 수 있으며,
필요한 경우 특정 시점으로만 되돌리거나, 더 이상 필요 없는 SAVEPOINT는 제거할 수도 있다.

반응형

✅ 왜 SAVEPOINT가 중요한가?

트랜잭션 내부에서 단계별로 처리되는 작업이 많을 때, 중간 오류에 유연하게 대응하려면
모든 트랜잭션을 처음부터 다시 시작하는 것보다 SAVEPOINT로 특정 부분만 취소하는 것이 효율적이다.

특히 다음과 같은 상황에서 매우 유용하다.

  • 조건에 따라 일부 작업만 무효화해야 할 때
  • 트랜잭션 내 다단계 작업이 포함된 프로시저 처리 시
  • 사용자 입력값 검증 실패 등 중간 에러 대응

SAVEPOINT는 복잡한 로직을 가진 애플리케이션에서 트랜잭션 처리의 유연성과 안정성을 모두 확보할 수 있는 기능이다.

⚙️ 기본 구문

SAVEPOINT 포인트명;
ROLLBACK TO SAVEPOINT 포인트명;
RELEASE SAVEPOINT 포인트명;
  • SAVEPOINT: 트랜잭션 중간에 포인트 생성
  • ROLLBACK TO SAVEPOINT: 특정 지점까지 되돌림
  • RELEASE SAVEPOINT: 더 이상 사용하지 않을 포인트 제거
반응형

🧪 실전 예제 1 – 상품 등록 중 오류 발생 처리

SET autocommit = 0;

START TRANSACTION;

INSERT INTO products (id, name) VALUES (1, '맥북프로');
SAVEPOINT step1;

INSERT INTO stock (product_id, quantity) VALUES (1, 50);
-- 오류 발생 (예: 외래키 제약 위반)

ROLLBACK TO SAVEPOINT step1;

-- 나머지 작업 계속 수행 가능

COMMIT;

이 예제는 상품 등록 도중 재고 테이블 삽입에서 문제가 발생했을 때
step1까지 롤백하고, 앞서 등록한 상품 정보는 유지한 채 나머지 처리를 이어가는 흐름이다.

🧪 실전 예제 2 – 여러 단계가 있는 회원 가입 절차

START TRANSACTION;

-- 1단계: 기본 회원 정보 입력
INSERT INTO members (id, name, email) VALUES (101, '홍길동', 'test@example.com');
SAVEPOINT member_inserted;

-- 2단계: 부가 정보 입력 (이메일 인증 실패 등 가능성 있음)
INSERT INTO member_details (member_id, verified) VALUES (101, 0);
-- 인증 실패 시
ROLLBACK TO SAVEPOINT member_inserted;

-- 혹은 계속 진행
COMMIT;

실무에서는 이처럼 상황에 따라 SAVEPOINT 지점으로 되돌릴 수 있는 구조를 만들어 놓는 것이 안전하다.

🔧 실전 예제 3 – SAVEPOINT 여러 개 사용하기

START TRANSACTION;

INSERT INTO test_log VALUES ('Step A 시작');
SAVEPOINT A;

INSERT INTO test_log VALUES ('Step B 시작');
SAVEPOINT B;

-- 문제가 발생했다고 가정
ROLLBACK TO SAVEPOINT B;

-- Step A는 유지됨
COMMIT;

복잡한 로직에서는 A → B → C 단계별로 SAVEPOINT를 만들어두고
상황에 따라 유연하게 ROLLBACK TO를 사용하는 방식이 일반적이다.

반응형

💡 RELEASE SAVEPOINT

더 이상 필요하지 않은 SAVEPOINT는 RELEASE SAVEPOINT로 제거할 수 있다.

RELEASE SAVEPOINT B;

이 명령은 리소스를 절약하고, 중복되는 SAVEPOINT 이름 충돌을 방지하는 데 도움이 된다.

⚠️ 주의사항 및 실무 팁

  1. SAVEPOINT는 트랜잭션 내에서만 유효하며, 트랜잭션이 종료되면 자동으로 사라진다.
  2. ROLLBACK TO SAVEPOINT 후 COMMIT을 호출해야 트랜잭션이 정상 종료된다.
  3. SAVEPOINT 이름은 세션 단위로 고유해야 하며 중복되지 않도록 주의해야 한다.
  4. RELEASE SAVEPOINT는 필수가 아니지만 리소스 정리를 위해 사용하는 것이 좋다.

📌 요약

항목 설명
명령어 SAVEPOINT
기능 트랜잭션 중간 지점 저장
관련 명령어 ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT
활용 사례 부분 롤백, 다단계 로직 처리, 중간 오류 대응
사용 조건 트랜잭션 내에서만 사용 가능
 

📎 공식 문서 참고

 
반응형