나쁜 경계: 외부 호출까지 안쪽
begin
주문 행과 재고 행을 잠근다.
↓
외부 API 대기
결제/메일/파일 I/O가 느리면 DB 락도 같이 길어진다.
↓
commit 실패 위험
외부 부작용은 이미 발생했는데 DB는 rollback될 수 있다.
외부 호출을 트랜잭션 안에 넣으면 커밋 전 잠금이 오래 유지된다. DB 변경은 빠르게 확정하고, 외부 처리는 커밋 이후 흐름으로 넘긴다.
주문 행과 재고 행을 잠근다.
결제/메일/파일 I/O가 느리면 DB 락도 같이 길어진다.
외부 부작용은 이미 발생했는데 DB는 rollback될 수 있다.
필요한 DB 변경과 outbox row를 함께 저장한다.
원자적으로 확정하고 잠금을 해제한다.
외부 전송은 실패해도 다시 시도할 수 있다.
락 보유 시간과 데드락 표면을 줄인다.
외부 실패는 outbox, saga, 보상으로 다룬다.
transaction id와 outbox id를 로그로 연결한다.