Short Boundary

트랜잭션 안에는 DB 일관성 작업만 짧게 둔다

외부 호출을 트랜잭션 안에 넣으면 커밋 전 잠금이 오래 유지된다. DB 변경은 빠르게 확정하고, 외부 처리는 커밋 이후 흐름으로 넘긴다.

나쁜 경계: 외부 호출까지 안쪽

begin

주문 행과 재고 행을 잠근다.

외부 API 대기

결제/메일/파일 I/O가 느리면 DB 락도 같이 길어진다.

commit 실패 위험

외부 부작용은 이미 발생했는데 DB는 rollback될 수 있다.

좋은 경계: DB 커밋 후 전달

begin

필요한 DB 변경과 outbox row를 함께 저장한다.

commit

원자적으로 확정하고 잠금을 해제한다.

relay 재시도

외부 전송은 실패해도 다시 시도할 수 있다.

짧게 유지

락 보유 시간과 데드락 표면을 줄인다.

복구 가능하게

외부 실패는 outbox, saga, 보상으로 다룬다.

관찰 가능하게

transaction id와 outbox id를 로그로 연결한다.