DB

[MySQL] DELETE + 트랜잭션 처리로 안전한 데이터 삭제 구현하기 🔐

인생아 2025. 7. 2. 18:20
반응형

MySQL에서 대량 데이터를 삭제하거나 복잡한 삭제 로직을 실행할 때는 실수로 인해 중요한 데이터가 손실될 수 있다.
이러한 상황을 방지하고 안정적인 삭제 연산을 수행하기 위해 사용하는 것이 바로 트랜잭션(TRANSACTION)이다.

트랜잭션을 활용하면 삭제 작업을 원자적(atomic)으로 처리할 수 있어, 문제가 발생했을 때 ROLLBACK으로 복구가 가능하다.

🧠 트랜잭션이란?

트랜잭션(Transaction)은 데이터베이스에서 하나의 작업 단위를 묶는 기능이다.
START TRANSACTION으로 시작하고, COMMIT 또는 ROLLBACK으로 끝나는 구조를 가진다.

MySQL에서 InnoDB 스토리지 엔진을 사용하는 경우에만 트랜잭션 처리가 가능하다.

🧾 기본 트랜잭션 + DELETE 문 사용 예시

START TRANSACTION;

DELETE FROM orders WHERE status = 'CANCELED';
DELETE FROM order_items WHERE order_id NOT IN (SELECT id FROM orders);

COMMIT;

위 코드는 취소된 주문과 그에 따른 아이템 데이터를 함께 삭제한다.
중간에 문제가 발생하면 ROLLBACK을 통해 이전 상태로 복구할 수 있다.

반응형

⚠️ 예외 발생 시 복구: ROLLBACK 예제

START TRANSACTION;

DELETE FROM users WHERE email IS NULL;

-- 삭제 후 데이터 검증
SELECT COUNT(*) FROM users;

ROLLBACK;

ROLLBACK을 실행하면 DELETE로 삭제한 내용도 모두 복구된다.
중요 데이터 삭제 테스트 시 매우 유용하게 사용된다.

📌 트랜잭션 처리 흐름 요약

  1. START TRANSACTION으로 시작
  2. 여러 개의 DELETE 또는 복합 SQL 실행
  3. 문제 없으면 COMMIT, 문제 발생 시 ROLLBACK

🧪 실무에서의 활용 예시

  • 회원 탈퇴 시 연관된 모든 정보 일괄 삭제 처리
  • 정산 데이터를 삭제하고 그에 따른 통계 재계산 트리거 실행
  • 오류 발생 시 이전 상태로 되돌리는 테스트 환경 구축
  • 데이터 마이그레이션 중 삭제 연산과 삽입 연산을 묶어 처리

🛡️ 트랜잭션 사용 시 주의사항

  • 반드시 InnoDB 테이블에서만 유효하며, MyISAM에서는 동작하지 않는다
  • DELETE 전에 SELECT로 대상 레코드를 확인하는 습관이 필요하다
  • 너무 많은 데이터를 한 번에 삭제하면 락이 오래 유지되므로 배치 처리 권장
DELETE FROM logs WHERE created_at < '2023-01-01' LIMIT 1000;

이와 같이 LIMIT을 활용하면 락을 줄이고 서버에 부담을 최소화할 수 있다.

🔍 실시간 문제 방지를 위한 자동 트랜잭션 처리

Spring 등 백엔드 프레임워크에서 트랜잭션을 자동 관리하는 경우가 많다.
이 경우는 직접 START TRANSACTION을 쓰기보다는, 프레임워크의 트랜잭션 어노테이션 등을 활용한다.

🔗 공식 문서 링크

 

반응형