아카이브사이트맵
© 2026 Rayon. All rights reserved.
DevDay
아티클랭킹스페이스채용
올리브영 favicon올리브영

올리브영 배치 중단의 숨겨진 원인: 트랜잭션, 스레드, 그리고 데드락

by DD
2024-11-06
1년 전
조회수 13

올리브영 배치 작업 중단 원인을 분석, DB 데드락 가능성을 제기

Spring Batch 내 트랜잭션 설정 오류와 ThreadPoolExecutor의 문제점 지적

CallerRunsPolicy로 인한 메인 스레드와 신규 스레드 간의 교착 상태 발생

Spring Batch와 트랜잭션의 함정

Spring Batch에서 @Transactional 설정 누락은 트랜잭션 분리 실패의 주요 원인이다. 구체적으로, Propagation.REQUIRED 설정은 Tasklet 단위 트랜잭션을 보장하지만, 멀티스레드 환경에서는 데이터 정합성 문제를 야기할 수 있다. 따라서, Propagation.REQUIRES_NEW 설정을 통해 각 스레드 간 독립적인 트랜잭션을 유지해야 한다.

ThreadPoolExecutor와 CallerRunsPolicy의 위험성

ThreadPoolExecutor의 CallerRunsPolicy는 스레드 풀이 꽉 찼을 때 메인 스레드에서 작업을 실행한다. 반면, 트랜잭션 미분리 상태에서 메인 스레드와 신규 스레드가 동일 데이터에 접근하면 교착 상태(Deadlock)가 발생한다. 따라서, 최대 스레드 수 조정 또는 큐 길이 무한대 설정을 통해 메인 스레드에서의 작업 실행을 방지해야 한다.

안정적인 배치 시스템 구축을 위한 제언

안정적인 배치 시스템 구축을 위해 트랜잭션 설정과 스레드 풀 정책을 신중하게 고려해야 한다. 구체적으로, Propagation.REQUIRES_NEW를 사용하여 트랜잭션 격리를 확보하고, CallerRunsPolicy 사용 시 최대 스레드 수 제한 또는 큐 관리를 통해 교착 상태를 예방해야 한다. 따라서, 데이터 정합성과 시스템 안정성을 동시에 확보해야 한다.

그날, 우리의 배치는 왜 멈추었을까?
중급
아키텍처
Spring Batch
ThreadPoolExecutor
Java
Backend
원문 읽기
원문 읽기

관련 추천 글

Spring Batch 6.0.4 및 5.2.6 출시

스프링 로고

Spring Boot 4.1 출시 후 최신 Spring 생태계 소식 모음!

스프링 로고

JFR로 잡은 12분 Jenkins 배치 Hang의 진실

무신사 로고

Spring AI 2.0 출시 및 CVE 급증 소식

스프링 로고

토스페이먼츠, 레거시 정산 시스템 개편으로 성능 10배 향상!

토스 로고

JFR(Java Flight Recording)으로 자바(Java) 성능 병목을 찾아내고 5배 향상시키다!

레딧 로고
올리브영 favicon올리브영
중급
아키텍처
Spring Batch
ThreadPoolExecutor
Java
Backend

관련 추천 글

Spring Batch 6.0.4 및 5.2.6 출시

스프링 로고

Spring Boot 4.1 출시 후 최신 Spring 생태계 소식 모음!

스프링 로고

JFR로 잡은 12분 Jenkins 배치 Hang의 진실

무신사 로고

댓글 0

첫 번째 댓글을 남겨보세요!