컴퓨터 과학/데이터 베이스

MySQL 중첩 트리거와 롤백 동작

Data Jun 2025. 8. 23. 16:39

MySQL에서 **트리거(Trigger)**는 INSERT, UPDATE, DELETE 같은 DML문이 실행될 때 자동으로 실행되는 객체입니다.
그런데 트리거가 서로 연결되어 실행되는 경우를 **중첩 트리거(Nested Trigger)**라고 부릅니다.

예를 들어:

  1. 주문 테이블(orderTbl)에 새로운 주문이 들어오면 → 재고 테이블(prodTbl)의 수량 차감
  2. 재고가 변경되면 → 배송 테이블(deliverTbl)에 배송 내역 자동 등록

이런 흐름을 중첩 트리거로 구현할 수 있습니다.

 

트리거 실행은 하나의 트랜잭션이다

트리거는 독립적으로 실행되지 않고, 원래 실행된 DML문과 같은 트랜잭션 맥락에서 실행됩니다.

즉,

  • INSERT INTO orderTbl ... 실행
  • → orderTrg 실행 (재고 차감)
  • → prodTrg 실행 (배송 등록)

이 모든 과정은 하나의 트랜잭션 단위로 묶입니다.

 

롤백 동작

중첩 트리거 중 하나라도 오류가 발생하면 어떻게 될까요?

  • 하나라도 실패 → 전체 롤백
  • orderTbl에 넣은 주문, prodTbl 재고 차감, deliverTbl 배송 등록까지 모두 취소됩니다.

예:

  1. 주문 INSERT → 성공
  2. 재고 UPDATE → 성공
  3. 배송 INSERT → 컬럼 오류 발생 🚫
    👉 결과: 주문/재고/배송 모두 롤백, 아무 데이터도 반영되지 않음

정리

  • 중첩 트리거는 하나의 트랜잭션으로 동작한다.
  • 트리거 체인 중 하나라도 실패하면 전체 롤백된다.
  • 덕분에 **데이터 일관성(Consistency)**이 보장된다.

 

한줄 결론
중첩 트리거는 자동화에 강력한 도구이지만, 하나의 트랜잭션으로 묶이기 때문에 중간 반영은 불가능하고, 하나의 에러 = 전체 롤백임을 꼭 기억해야 합니다.