DB

[MySQL] ROLLBACK 완벽 가이드 사용법(변경사항 취소)

인생아 2025. 6. 17. 15:52
반응형

MySQL에서 트랜잭션을 사용하면, 여러 개의 데이터 변경 작업을 하나의 논리적 작업 단위로 묶어 처리할 수 있다.
이때 문제가 생겼을 경우, 전체 변경 사항을 한 번에 되돌릴 수 있는 강력한 명령어가 바로 ROLLBACK이다.

🔍 ROLLBACK 명령어란?

ROLLBACK은 현재 트랜잭션에서 이루어진 모든 변경 사항을 취소하는 명령어이다.
트랜잭션이 시작된 이후 COMMIT 이전까지의 모든 작업을 되돌리는 역할을 한다.

ROLLBACK;

이 명령어는 실무에서 데이터 손실, 입력 오류, 예외 발생 등 다양한 상황에 대처하기 위해 매우 자주 사용된다.
MySQL에서 데이터 복구의 마지막 보루라 할 수 있다.

반응형

✅ ROLLBACK이 필요한 상황

  • 사용자의 잘못된 입력으로 인해 데이터가 잘못 저장되었을 때
  • 프로그래밍 로직 중 예외(Exception)가 발생했을 때
  • 비즈니스 조건(예: 재고 부족 등)을 만족하지 못할 때
  • 중간 작업 중 실패가 발생하여 전체 작업을 무효화해야 할 때

이런 상황에서 ROLLBACK은 데이터의 정합성을 유지하기 위한 가장 안전한 해결책이다.

🚨 autocommit 설정과의 관계

MySQL은 기본적으로 autocommit = 1 상태이다.
이 경우에는 트랜잭션이 자동으로 커밋되기 때문에 ROLLBACK이 아무 효과도 발휘하지 못한다.

따라서 반드시 트랜잭션을 수동으로 관리하는 방식으로 전환해야 한다.

SET autocommit = 0;
START TRANSACTION;

-- 데이터 변경 작업

ROLLBACK;

이렇게 해야만 ROLLBACK을 실행했을 때 변경 사항을 안전하게 취소할 수 있다.

반응형

🧪 실전 예제 1 – 잘못된 데이터 입력 취소

SET autocommit = 0;

START TRANSACTION;

INSERT INTO orders (order_id, user_id, total_price) VALUES (1002, 3, 85000);
UPDATE users SET point = point + 850 WHERE user_id = 3;

-- 문제 발생
ROLLBACK;

위 예제에서는 포인트 적립 과정 중 오류가 발생했다고 가정하고, 전체 작업을 ROLLBACK으로 취소한다.
이 방식은 실무에서 데이터 일관성 유지에 매우 중요하게 사용된다.

🧪 실전 예제 2 – 유효성 검사 후 롤백

START TRANSACTION;

UPDATE inventory SET stock = stock - 10 WHERE product_id = 200;

-- 재고가 0보다 작아지면 롤백
SELECT CASE
  WHEN (SELECT stock FROM inventory WHERE product_id = 200) < 0 THEN
    ROLLBACK
  ELSE
    COMMIT
END CASE;

이 구조는 비즈니스 로직 조건에 따라 트랜잭션을 선택적으로 취소하는 대표적인 예시이다.
조건 기반 롤백 처리는 실무에서 자주 쓰이는 패턴이다.

반응형

🧪 실전 예제 3 – 예외 발생 시 롤백 처리 (Stored Procedure 내 사용)

DELIMITER //

CREATE PROCEDURE TransferMoney()
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    ROLLBACK;
  END;

  START TRANSACTION;

  UPDATE accounts SET balance = balance - 1000 WHERE account_id = 1;
  UPDATE accounts SET balance = balance + 1000 WHERE account_id = 2;

  COMMIT;
END;
//

DELIMITER ;

위와 같이 저장 프로시저(Stored Procedure) 내부에서도 ROLLBACK은 자주 활용되며,
오류 발생 시 자동으로 실행되도록 예외 처리 핸들러와 함께 사용된다.

✅ COMMIT vs ROLLBACK 비교

항목 COMMIT ROLLBACK
기능 변경 사항을 확정 변경 사항을 취소
트랜잭션 종료 여부 종료 종료
실행 조건 정상 처리 완료 시 예외 또는 오류 발생 시
실행 이후 상태 되돌릴 수 없음 변경 이전 상태로 복원
 

트랜잭션은 항상 COMMIT이나 ROLLBACK 중 하나로 종료되어야 한다.
그렇지 않으면 세션이 잠기고, 데이터 무결성에도 악영향을 줄 수 있다.

반응형

✅ 주의사항 및 실무 팁

  1. COMMIT 이후에는 ROLLBACK이 불가능하다. 반드시 실행 전에 데이터를 재확인해야 한다.
  2. ROLLBACK은 트랜잭션 내부에서만 유효하다. 트랜잭션을 시작하지 않은 경우에는 아무 효과도 없다.
  3. ROLLBACK TO SAVEPOINT 명령어를 사용하면 부분 롤백도 가능하다.
  4. ROLLBACK 후에는 필요한 경우 로그 테이블 등을 통해 작업 히스토리를 기록하는 것도 좋은 방법이다.

📌 요약

  • ROLLBACK은 트랜잭션 내 변경 사항을 모두 취소하는 명령어이다.
  • autocommit이 비활성화된 상태에서만 유효하다.
  • 오류, 예외, 조건 불일치 시 데이터 정합성을 지키기 위해 필수로 사용된다.
  • 실무에서는 예외처리, 조건검사, 저장 프로시저 등 다양한 방식과 함께 활용된다.

📎 공식 문서 참고

 
반응형