강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

정성훈님의 프로필 이미지
정성훈

작성한 질문수

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

3장. 작전1: 관계형 데이터베이스 읽고 쓰기 (테이블의 심장에 처형장을 세우다 ☠️)

스냅샷 읽기

작성

·

40

1

cursorReader에서 스냅샷을 읽어서 동일한 스탭에서 데이터가 변경되어도 영향을 받지 않는다 하셨는데,
이거는 mysql의 repeatable read와 관련된 스냅샷인걸까요? 아니면 배치 자체에서 제공하는 스냅샷인가요?

답변 2

1

KILL-9님의 프로필 이미지
KILL-9
지식공유자

KILL-9@/bin/technical_response:~$ cat cursor_snapshot_explanation.log

╔═════════════════════════════════════════════════════════════════════╗
║              🚨 CURSOR SNAPSHOT DEEP DIVE INITIATED 🚨              ║
║                  TECHNICAL BREAKDOWN PROTOCOL                       ║
╚═════════════════════════════════════════════════════════════════════╝

[TIMESTAMP]: System.currentTimeMillis()
[SEVERITY]: CORE_CONCEPT_CLARIFICATION
[STATUS]: 안그래도 저 부분을 작성할 당시 질문이 많이 들어올 수 있겠구나라고 생각한 내용을 너가 처음으로 질문하는구나. 그동안 아무도 이 부분에 대해 의문을 갖지 않았다.

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ TECHNICAL EXPLANATION INITIATED ▓▓▓▓▓▓▓▓▓▓▓▓▓▓

설명한다. 우선 격리 레벨과 상관없이 디비(일부 드라이버 레벨) 레벨에서 제공하는 스냅샷이다.

└─> [STARTING_POINT]: PostgreSQL부터 이야기하자

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ POSTGRESQL CURSOR BEHAVIOR ▓▓▓▓▓▓▓▓▓▓▓▓▓▓

└─> [CORE_CHARACTERISTIC]: PostgreSQL은 커서 실행시점의 스냅샷을 제공한다
└─> [DEFINITION]: 다시 말해 PostgreSQL의 커서는 **INSENSITIVE**하다
└─> [RESULT]: 데이터 변경에 영향받지 않음

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ MYSQL ANALYSIS - THE COMPLEX CASE ▓▓▓▓▓▓▓▓▓▓▓▓▓▓

└─> [WARNING]: 쓸데없는 설명이 길어질 것 같아 강의에선 생략하였으나...
└─> [REALITY]: MySQL의 경우 두 가지 경우로 나눌 수 있다

**CASE 1: JDBC Driver 기본 동작 (useCursorFetch=false)**
└─> [MECHANISM]: JDBC driver가 전체 데이터를 모두 가져오기 때문에 스냅샷과 동일
└─> [REFERENCE]: 강의에서 인용으로 설명한 것처럼

**CASE 2: useCursorFetch=true인 경우**  
└─> [MECHANISM]: MySQL이 쿼리 실행 시점의 스냅샷을 임시 공간에 저장해 이를 스트리밍하는 방식
└─> [CLASSIFICATION]: 따라서 이 방식도 **INSENSITIVE**

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ FINAL CONCLUSION ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
└─> [RESULT]: 결과적으로 "데이터 변경에 영향을 받지 않는다"가 된다

[SYSTEM] Technical explanation complete
[INFO]  Database cursor behavior: DEMYSTIFIED
[WARN]  This is why proper understanding matters in enterprise batch processing

💀 KILL-9 SYSTEM TERMINATOR  
Process terminated with exit code: KNOWLEDGE_TRANSFERRED_SUCCESSFULLY
정성훈님의 프로필 이미지
정성훈
질문자

요점은 앱이 아니라 db 레벨에서 제공하는 스냅샷을 통해 이뤄진다는거네요 감사합니다.

KILL-9님의 프로필 이미지
KILL-9
지식공유자

 ██████╗  ██████╗  ██████╗ ██████╗      ██╗ ██████╗ ██████╗ 
██╔════╝ ██╔═══██╗██╔═══██╗██╔══██╗     ██║██╔═══██╗██╔══██╗
██║  ███╗██║   ██║██║   ██║██║  ██║     ██║██║   ██║██████╔╝
██║   ██║██║   ██║██║   ██║██║  ██║██   ██║██║   ██║██╔══██╗
╚██████╔╝╚██████╔╝╚██████╔╝██████╔╝╚█████╔╝╚██████╔╝██████╔╝
 ╚═════╝  ╚═════╝  ╚═════╝ ╚═════╝  ╚════╝  ╚═════╝ ╚═════╝ 
                                                              
██╗    ██╗ █████╗ ██████╗ ██████╗ ██╗ ██████╗ ██████╗ ███████╗
██║    ██║██╔══██╗██╔══██╗██╔══██╗██║██╔═══██╗██╔══██╗██╔════╝
██║ █╗ ██║███████║██████╔╝██████╔╝██║██║   ██║██████╔╝███████╗
██║███╗██║██╔══██║██╔══██╗██╔══██╗██║██║   ██║██╔══██╗╚════██║
╚███╔███╔╝██║  ██║██║  ██║██║  ██║██║╚██████╔╝██║  ██║███████║
 ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝

0

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

정성훈님, 질문해주신 “스냅샷 읽기” 관련하여, 이는 주로 데이터베이스의 트랜잭션 격리 수준과 관련이 있습니다. 여기서 언급된 스냅샷은 MySQL의 트랜잭션 격리 수준인 “Repeatable Read”와 관련이 있습니다.

스냅샷 읽기와 Repeatable Read

  • 스냅샷: 트랜잭션이 시작될 때의 데이터 상태를 의미하며, 트랜잭션 격리 수준에 따라서 스냅샷이 유지됩니다.
  • Repeatable Read: MySQL에서 기본적으로 제공하는 트랜잭션 격리 수준 중 하나로, 특정 트랜잭션 내에서 동일한 데이터를 반복 조회할 때 항상 일관된 결과를 보장합니다. 즉, 트랜잭션이 시작된 후 다른 트랜잭션이 데이터를 변경하더라도, 최초 트랜잭션의 시작 시점의 스냅샷을 참조하여 일관된 데이터를 제공합니다.

Spring Batch와의 관계

  • CursorReader: 일반적으로 데이터베이스의 커서(cursor)를 통해 데이터를 순차적으로 읽습니다. 이 경우 데이터베이스 트랜잭션의 격리 수준에 따라 스냅샷이 활용될 수 있습니다.
  • Spring Batch 자체의 제공 기능이 아니라, 사용 중인 데이터베이스의 트랜잭션 격리 수준을 이용하여 구현됩니다.

관련된 기존 답변과 유사한 질문을 참고하시면 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

정성훈님의 프로필 이미지
정성훈

작성한 질문수

질문하기