[Spring Batch] 낙관적 잠금 오류 (OptimisticLockingFailureException) 해결하기

2024. 4. 19. 15:20·개발중/Spring Batch
728x90
반응형

서론

현대의 소프트웨어 개발에서 병렬 처리와 데이터 동시성은 필수적이지만, 이로 인해 예상치 못한 오류에 직면할 때가 많습니다. 본 포스트에서는 Spring Batch에서 흔히 발생하는 OptimisticLockingFailureException 오류를 다루고, 이를 flush() 메소드를 사용하여 해결한 경험을 공유하고자 합니다. 이 오류가 프로젝트에 미치는 영향을 이해하고 대처법을 배우는 것은 모든 데이터 중심 애플리케이션 개발자에게 중요할 것입니다.

문제 상세 설명

OptimisticLockingFailureException은 낙관적 잠금 기법을 사용할 때 발생합니다. 이 기법은 동시에 같은 데이터에 여러 트랜잭션이 접근하려 할 때 사용되는데, 데이터 무결성을 보장하기 위해 데이터의 버전을 체크합니다. 문제는 업데이트하려는 데이터의 버전이 기대하는 버전과 맞지 않을 때 발생합니다. 이 오류가 발생한 환경은 Spring Framework 5와 Hibernate를 사용한 서버 측 애플리케이션에서였으며, 복잡한 데이터 처리 로직이 포함된 배치 작업 중에 주로 발생했습니다.

 

org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=321 with wrong version (1), where current version is 2
	at org.springframework.batch.core.repository.dao.JdbcStepExecutionDao.updateStepExecution(JdbcStepExecutionDao.java:291) ~[spring-batch-core-5.1.0.jar!/:5.1.0]

 


해결 방법

flush() 메소드는 Hibernate Session의 변경 내용을 데이터베이스에 즉시 반영하도록 강제합니다. 이 방법을 통해, 데이터베이스와 애플리케이션의 상태 불일치를 해결할 수 있었습니다. 아래는 해당 메소드를 적용한 코드 예시입니다:

 

    @Override
    public void write(Chunk<? extends VehicleRecallInfo> chunk){
            for(VehicleRecallInfo x : chunk.getItems()){
                System.out.println(x.toString());
                hyundaiRepository.save(x);
                hyundaiRepository.flush();
            }
    }

 

 

이 외에도 세션의 캐시를 클리어하거나 트랜잭션 재시도 로직을 구현하는 방법도 고려했으나, flush()를 사용한 방법이 이 상황에서 가장 효과적이었습니다.

728x90
반응형
저작자표시 (새창열림)

'개발중 > Spring Batch' 카테고리의 다른 글

Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'  (0) 2024.12.26
Spring Batch 관련 Table 자동 생성 안될 때 수동 생성하는 방법  (1) 2024.11.19
Spring Batch 로 대용량 일괄처리하기. (대용량 데이터 조회 > 액셀 생성 > 메일 발송)  (1) 2023.10.13
Spring Batch 처음 실행해봅니다. 👨‍💻 ( 완전 간단 예제 )  (0) 2023.10.11
[Spring Batch 에러] Caused by:org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAMEFROM BATCH_JOB_INSTANCEWHERE JOB_NAME = ? and JOB_KEY = ?]  (0) 2023.10.11
'개발중/Spring Batch' 카테고리의 다른 글
  • Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
  • Spring Batch 관련 Table 자동 생성 안될 때 수동 생성하는 방법
  • Spring Batch 로 대용량 일괄처리하기. (대용량 데이터 조회 > 액셀 생성 > 메일 발송)
  • Spring Batch 처음 실행해봅니다. 👨‍💻 ( 완전 간단 예제 )
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (932)
      • 개발중 (634)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크 관리사 요약
    git
    스프링
    java
    VUE
    네트워크 관리사 자격증
    리눅스 마스터
    네트워크 관리사 학점
    리눅스 마스터 요약
    리눅스 마스터 1급 정리
    네트워크 관리사
    springboot
    Git 저장소
    Spring
    리눅스 마스터 1급
    쿠버네티스
    파이썬 알고리즘
    REST API
    네트워크 관리사 2급
    네트워크 관리사 실기
    redis
    알고리즘
    리눅스 1급 요약
    docker
    리눅스 마스터 1급 요약
    jpa
    BackendDevelopment
    파이썬
    네트워크 관리사 2급 실기
    쿠버네티스 스터디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
[Spring Batch] 낙관적 잠금 오류 (OptimisticLockingFailureException) 해결하기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.