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

by DD
1년 전
조회수 11

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

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

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

Spring Batch와 트랜잭션의 함정

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

ThreadPoolExecutor와 CallerRunsPolicy의 위험성

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

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

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

그날, 우리의 배치는 왜 멈추었을까?