inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

1장. 작전1: 바이너리 초이스 - 스프링 배치의 두 가지 스텝 유형 (양자택일... 죽음의 선택이다 ☠️)

청크 단위의 트랜잭션 롤백에 대한 질문

79

tjrwn0716

작성한 질문수 14

1

청크 단위로 트랜잭션

된다는건 이해했다. 그에 관련해서 궁금증이 생겼는데,

reader, processor에서 처리하다가 Exception이 나도 사실 DB엔 롤백할게 없으니 사실상 Writer 작업 중에만 단 한번 롤백이 수행될 것이라고 예상되는데 맞는가?

read 시에, process 도중에도 롤백이 일어날 경우가 있는지 궁금하다.

 

추가로 과거 스프링 배치 공식 문서의 잘못된 다이어그램 이라던지

null을 줘야 끝난다는 점과 97개 와 같이 자세한 예시를 들어준 점,

read(), process()가 각각 10번씩 수행된다는 것과 같이

사용자들이 많이 헷갈려 하는걸 명확하게 알려줘서 좋은 것 같다.

 

 

 

 

java spring spring-boot spring-batch backend

답변 2

1

KILL-9

$ cat answer.txt

좋은 질문이다

> "ItemReader, ItemProcessor에서 Exception 나도 DB 롤백할 게 없으니 실질적으론 ItemWriter에서만 롤백되는 거 아닌가?"

괴상한 커스텀 구현이 아니고서야 일반적으로 너의 말이 옳다
ItemReader는 읽기만, ItemProcessor는 변환만 하니까
실제 롤백 대상은 ItemWriter의 쓰기 작업이 맞다

$ but wait...

그렇다고 ItemReader/ItemProcessor가 트랜잭션 안에 묶인 게(청크 단위로 트랜잭션 경계가 정해진다는게) 
무의미한 건 아니다

# Case 1: 데이터 일관성 보호
ItemReader가 DB에서 데이터를 읽는다고 치자
이 읽기 작업은 트랜잭션 격리수준의 보호를 받는다
(REPEATABLE_READ라면 스냅샷 격리)  

외부의 변화로부터 독립된 읽기가 가능하다는 뜻이지
- 청크 처리 중간에 다른 트랜잭션이 데이터 변경해도
- 현재 청크는 시작 시점의 일관된 데이터로 작업한다

// 커서 기반 ItemReader를 사용하느냐 Paging 기반 ItemRreader를 사용할 때 페이지 사이즈의 크기가 어떤지 등의 복잡성을 일으키는 내용은 무시하자


# Case 2: ItemProcessor의 추가 조회
ItemProcessor 안에서 추가 DB 조회하는 경우:
User user = userRepository.findById(item.getUserId());

이 조회도 동일한 트랜잭션/격리수준의 보호를 받는다
ItemReader가 읽은 시점과 일관된 데이터를 보장받는 거지

$ summary
- 롤백 대상은 주로 ItemWriter 맞다
- 하지만 ItemReader + ItemProcessor가 같은 트랜잭션 = 일관된 데이터 읽기/가공 보장

chmod +x consistent_data.sh

참고 1): ItemReader가 커서 방식이냐 페이징이냐(또 여기선 페이지 크기가 어떻냐 청크 사이즈는 어떻냐 등), 격리 수준은 어떻냐 등에 따라 이야기가 복잡해질 수 있는데 이런 내용은 이해에 복잡도만 올리니 무시하자

- KILL-9

 

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

tjrwn0716님께서 청크 단위 트랜잭션 롤백에 대해 질문을 주셨네요. Spring Batch에서 트랜잭션 처리는 청크 단위로 이루어지며, 이는 데이터 처리의 안정성을 유지하기 위한 중요한 기능입니다.

청크 단위 트랜잭션의 롤백

  1. 청크 트랜잭션의 범위

    • 청크 단위 트랜잭션은 ItemReader, ItemProcessor, 및 ItemWriter가 모두 포함됩니다. 따라서, 읽기, 처리, 쓰기 각각의 단계에서 예외가 발생하면 전체 청크가 롤백됩니다.
  2. 롤백의 실제 수행

    • ItemReaderItemProcessor에서 발생한 예외 또한 트랜잭션 롤백을 유발합니다. 예외가 발생하면 현재 처리 중이던 청크 전체가 롤백되며, 이는 항상 ItemWriter 이후에만 롤백되는 것이 아니기 때문에 tjrwn0716님께서는 read나 process 중에도 롤백이 발생할 수 있음을 염두에 두셔야 합니다.
  3. 트랜잭션 롤백 예시

    • 가령 read() 메서드가 현재 청크 사이즈의 중간에서 실패하면, 해당 청크의 부분적인 작업들은 모두 롤백됩니다.
    • process() 메서드에서도 오류가 발생하면 마찬가지로 트랜잭션이 롤백됩니다. 이러한 동작은 데이터의 일관성을 유지하는데 중요한 역할을 합니다.

관련된 내용을 더 깊이 이해하시려면, Spring Batch의 공식 문서 및 아래의 유사한 질문을 참고하시길 권장드립니다:
- 청크 단위 트랜잭션과 롤백의 이해

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

형 책 어떻게 받아?

1

59

1

JpaCursorItemReader의 정렬 조건 부재의 영향

1

46

2

"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션

1

53

2

형 이번에 낸 책이랑 강의 내용에 차이가 있어?

1

90

1

형 나 몰래 책내면 모를 줄 알고?

2

79

2

강의 중복 확인 요청

1

43

1

중복내용 제보?!

1

73

2

Json 요청 처리

1

69

2

[건의][6장][작전1] deprecated 메소드

1

78

2

[예제][3장][작전2] windows 에서 마지막 예제

1

71

2

[오타][3장][작전1] 형 이건 빨리 해줘

2

128

2

[오타] "리스너 활용: 시스템 완전 장악 매뉴얼" 부분

1

78

1

[오타] "JobScope와 StepScope 사용 시 주의사항" 부분

1

76

2

spring boot 4 + spring batch 6 설정 변경?

1

147

2

Batch 패키지 설계 — 실무에서 Job 단위 구조

1

128

2

Spring batch를 실행해줄 스케줄러와 batch 실행 환경

1

103

1

메타테이블에 데이터가 생기지 않는 이유

1

134

2

Spring Batch 4.3.10 ExecutionContext 한글 인코딩 이슈 관련 문의

1

125

2

@StepScope 또는 @JobScope와 JobOperator

1

165

5

Remote Partitioning

1

120

2

킬구형 실무에서는 JPA ItemReader / ItemWriter를 더 선호해? 아니면 JDBC itemReader/ItemWriter를 더 선호해?

1

154

2

병렬 중첩

1

111

3

형 코드에 public static class 이게 뭐야 ?

1

151

3

ExitStatus

1

73

2