IT이야기/데이터베이스

롤백(Rollback): 데이터 무결성을 유지하는 핵심 트랜잭션 제어 기술

Chiba-in 2025. 2. 27. 09:30

🔹 롤백(Rollback)이란?

1. 롤백(Rollback)의 정의

롤백(Rollback)은 데이터베이스 트랜잭션에서 오류가 발생했을 때, 변경된 데이터를 이전 상태로 되돌리는 기능입니다.
즉, 트랜잭션이 정상적으로 완료되지 않으면 해당 트랜잭션에서 실행된 모든 SQL 작업을 취소하고, 데이터베이스를 변경 전 상태로 복구합니다.

롤백의 주요 목적:

  • 데이터 무결성(Integrity) 유지
  • 오류 발생 시 안전한 데이터 복구
  • 잘못된 데이터 입력 방지
  • 동시성 제어 및 충돌 방지

📌 롤백은 은행 거래, 전자상거래 주문 처리, 예약 시스템 등 데이터 신뢰성이 중요한 시스템에서 필수적인 기능


🔹 롤백의 동작 방식

롤백은 트랜잭션이 시작된 이후 변경된 데이터를 COMMIT 전까지 되돌리는 역할을 합니다.

✔️ 롤백의 기본 동작 흐름

  1. 트랜잭션 시작 (BEGIN TRANSACTION)
  2. SQL 실행 (INSERT, UPDATE, DELETE 등)
  3. 문제 발생 (시스템 오류, 조건 불만족, 충돌 등)
  4. ROLLBACK 실행 → 데이터 변경 이전 상태로 복구

✔️ 기본 롤백 예제 (SQL)

BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
UPDATE Accounts SET Balance = Balance + 500 WHERE AccountID = 1002;
ROLLBACK;  -- 오류 발생 시 모든 변경 사항 취소

📌 트랜잭션이 완료되기 전(COMMIT 이전)에 ROLLBACK이 실행되면, 데이터는 변경되지 않음


🔹 롤백과 커밋(COMMIT) 비교

트랜잭션 제어 명령어 설명
ROLLBACK 트랜잭션이 실패했을 때 모든 변경 사항을 취소하고 이전 상태로 복구
COMMIT 트랜잭션이 성공적으로 완료되었을 때 변경 사항을 데이터베이스에 영구적으로 저장

✔️ COMMIT과 ROLLBACK 비교 예제

BEGIN TRANSACTION;
UPDATE Products SET Price = Price * 1.1 WHERE Category = 'Electronics';

-- 오류 발생 시 롤백
IF @@ERROR <> 0 
    ROLLBACK;
ELSE 
    COMMIT;

📌 오류가 발생하면 ROLLBACK, 성공하면 COMMIT을 실행하여 변경 사항을 반영


🔹 자동 롤백과 수동 롤백

1. 자동 롤백 (Implicit Rollback)

  • 트랜잭션이 비정상적으로 종료되면 자동으로 롤백됨
  • 예: 서버 장애, 네트워크 끊김, 디스크 오류 등

✔️ 자동 롤백 예제

BEGIN TRANSACTION;
UPDATE Orders SET Status = 'Shipped' WHERE OrderID = 101;
-- 네트워크 오류 발생 → 자동 ROLLBACK

📌 트랜잭션이 정상적으로 종료되지 않으면 변경된 데이터가 자동으로 롤백됨


2. 수동 롤백 (Explicit Rollback)

  • 사용자가 직접 ROLLBACK 명령을 실행하여 데이터 변경을 취소
  • 예: 비즈니스 로직 조건 불충족, 데이터 충돌 등

✔️ 수동 롤백 예제 (SQL)

BEGIN TRANSACTION;
UPDATE Inventory SET Stock = Stock - 1 WHERE ProductID = 5001;

-- 재고가 0보다 작아지는 경우 롤백
IF (SELECT Stock FROM Inventory WHERE ProductID = 5001) < 0
    ROLLBACK;
ELSE
    COMMIT;

📌 조건을 확인하여 데이터 정합성이 깨지는 경우 롤백 처리


🔹 롤백의 실무 활용 사례

1. 은행 계좌 이체에서 오류 발생 시 롤백

📌 활용:

  • 송금 과정에서 중간에 오류가 발생하면 계좌 잔액을 원래대로 되돌려야 함

✔️ SQL 코드:

BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 1000 WHERE AccountID = 1001;
UPDATE Accounts SET Balance = Balance + 1000 WHERE AccountID = 1002;

-- 계좌 잔액이 음수가 되면 롤백
IF (SELECT Balance FROM Accounts WHERE AccountID = 1001) < 0
    ROLLBACK;
ELSE
    COMMIT;

📌 출금 계좌의 잔액이 부족하면 ROLLBACK을 실행하여 데이터 오류 방지


2. 온라인 쇼핑몰에서 결제 오류 발생 시 롤백

📌 활용:

  • 결제 승인 중 오류가 발생하면 주문 상태를 원래대로 돌려야 함

✔️ SQL 코드:

BEGIN TRANSACTION;
UPDATE Orders SET Status = 'Paid' WHERE OrderID = 101;
UPDATE Payments SET Status = 'Approved' WHERE OrderID = 101;

-- 결제 승인 실패 시 롤백
IF (SELECT Status FROM Payments WHERE OrderID = 101) <> 'Approved'
    ROLLBACK;
ELSE
    COMMIT;

📌 결제 오류 발생 시 주문 상태를 원래 상태로 되돌려야 함


3. 재고 관리 시스템에서 초과 주문 방지

📌 활용:

  • 주문 수량이 재고보다 많으면 롤백하여 초과 주문 방지

✔️ SQL 코드:

BEGIN TRANSACTION;
UPDATE Inventory SET Stock = Stock - 5 WHERE ProductID = 5001;

-- 재고가 부족하면 롤백
IF (SELECT Stock FROM Inventory WHERE ProductID = 5001) < 0
    ROLLBACK;
ELSE
    COMMIT;

📌 재고 부족 시 롤백하여 데이터 정합성을 유지


📌 결론

롤백(Rollback)은 데이터베이스 트랜잭션에서 오류 발생 시 데이터를 이전 상태로 복구하는 기능이다.
트랜잭션이 정상적으로 완료되지 않으면, 자동 또는 수동으로 ROLLBACK을 실행하여 데이터 무결성을 유지한다.
ROLLBACK과 COMMIT을 적절히 활용하면, 금융 시스템, 전자상거래, 재고 관리 등에서 데이터 정합성을 보장할 수 있다.
트랜잭션 오류 감지를 위한 IF 문과 결합하여 ROLLBACK을 활용하면 비즈니스 로직을 더욱 안정적으로 관리할 수 있다.