부분 롤백의 핵심

주문 헤더는 남기고, 실패한 상세항목 시도만 되돌린다

ROLLBACK TO after_order는 트랜잭션 전체를 취소하지 않습니다. SAVEPOINT 뒤에서 시도한 order_items만 지운 뒤, 다른 상품으로 다시 넣고 같은 트랜잭션에서 COMMIT할 수 있습니다.

이 다이어그램의 질문 무엇이 유지되고
무엇만 되감기는가?
1. 기준점 SAVEPOINT 직후

주문은 이미 생성되었고, 상세항목은 아직 없습니다.

2. 실패 시도 상품 101 입력 후 문제 발견

재고 부족이 확인되면 이 시도만 취소 대상으로 봅니다.

3. 최종 확정 부분 롤백 후 상품 102로 대체

기준점으로 돌아간 뒤 다시 넣고 같은 트랜잭션을 커밋합니다.

orders
orders 행은 SAVEPOINT 이전에 생성되었으므로, 부분 롤백 구간 밖에 있어 끝까지 유지됩니다.
생성 완료 주문 헤더 1건 존재
롤백 대상 아님 실패해도 삭제되지 않음
함께 확정 COMMIT 시 그대로 저장
order_items
비어 있음 아직 상세항목 없음

after_order는 이 상태를 기준점으로 기억합니다.

임시 상태 상품 101 × 2

이 입력은 SAVEPOINT 이후에 발생했으므로 문제가 생기면 지울 수 있습니다.

최종 결과 상품 102 × 1

ROLLBACK TO로 101 입력을 없앤 뒤, 102를 다시 넣어 최종 상세항목으로 확정합니다.

명령 흐름
SAVEPOINT after_order
INSERT INTO order_items (... product_id = 101 ...)
-- 재고 부족 발견
ROLLBACK TO after_order
INSERT INTO order_items (... product_id = 102 ...)
COMMIT
기억할 점

ROLLBACK TO after_order 이후에도 트랜잭션은 계속 열려 있습니다. 그래서 마지막에는 COMMIT 또는 전체 ROLLBACK으로 마무리해야 합니다.