올리브영 배치 중단의 숨겨진 원인: 트랜잭션, 스레드, 그리고 데드락
올리브영 배치 작업 중단 원인을 분석, 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 사용 시 최대 스레드 수 제한 또는 큐 관리를 통해 교착 상태를 예방해야 한다. 따라서, 데이터 정합성과 시스템 안정성을 동시에 확보해야 한다.