배치 처리의 트랜잭션

트랜잭션은 전체 작업이 아니라 chunk 경계에서 닫힌다

Spring Batch는 ItemReader → ItemProcessor → ItemWriter 를 하나의 chunk로 묶고, writer까지 끝난 뒤 commit합니다. 그래서 실패해도 전체가 아니라 현재 chunk만 rollback됩니다.

한 chunk 내부에서 실제로 일어나는 일
chunk-size = 1000
트랜잭션 1개
읽기
ItemReader
처리할 레코드 1,000건을 현재 chunk로 가져옵니다.
변환
ItemProcessor
검증, 계산, 매핑을 수행하지만 아직 영구 반영되지는 않습니다.
쓰기
ItemWriter
같은 chunk의 결과를 DB에 기록할 준비를 마칩니다.
경계
COMMIT
writer 완료 후 한 번에 반영합니다. 여기 전까지가 같은 트랜잭션 범위입니다.
트랜잭션 열림 chunk 시작 commit 직전까지 rollback 가능
작업 전체에서는 이 경계가 반복됩니다
앞에서 commit된 chunk는 뒤의 실패로 되돌아가지 않습니다.
chunk 1 COMMIT 처리 완료된 1,000건은 영구 반영
chunk 2 COMMIT 다음 1,000건도 독립적으로 확정
chunk 3 ROLLBACK 실패한 현재 chunk만 되돌리고 재시도
chunk 4+ 계속 진행 복구 후 나머지 chunk를 이어서 처리
운영 관점의 핵심: chunk 단위 커밋은 로그 부담과 락 유지 시간을 줄이고, 장애가 나도 해당 chunk만 다시 처리하면 되게 만듭니다.