Spring4 Spring Batch는 왜 내 MariaDB에 데드락을 뿌렸나 — SERIALIZABLE 기본값과 동시 실행의 함정 TL;DRSpring Batch의 JobRepository는 기본적으로 SERIALIZABLE 격리 수준으로 메타 테이블에 접근한다여러 Job을 동시에 실행하면 BATCH_JOB_INSTANCE 등 메타 테이블과 서비스 테이블에서 갭락 경합이 발생해 데드락이 생긴다메타 DataSource와 비즈니스 DataSource를 같이 쓰면, SERIALIZABLE이 비즈니스 트랜잭션까지 새어들어 대량 delete→insert 패턴에서 두 번째 데드락이 터진다해결의 핵심은 세 가지: JobRepository isolation 낮추기, DataSource 분리, delete→insert 패턴 재설계대상 독자Spring Batch + 스케줄러(Quartz, Spring Scheduler, Jobrunr, k8s Cro.. Spring/문제 해결 사례 2026. 4. 26. Spring Kafka 트랜잭션 + 비동기/재시도 = 반드시 터진다 (Fencing & Timeout 실무 장애 분석) TL; DRKafka 트랜잭션은 같은 transactional.id에 단 하나의 producer만 허용한다.비동기 처리나 재시도로 producer가 하나 더 생성되는 순간, 기존 트랜잭션은 fencing으로 즉시 죽는다. 1. 장애 상황아침에 출근하고, 얼마 전 배포한 새벽 배치 결과를 확인했다.십여 개의 배치 중 몇 개가 실패했다. 전부가 아니라 "일부만" 실패했다는 점이 이상했다.스케줄러는 순차적으로 배치를 실행하고 있었고,개발 환경에서도 문제 없었고, 며칠간 운영에서도 정상이었다. 에러는 두 가지였다메타 테이블을 확인해보니 두 가지 예외가 있었다.60초 commit timeoutProducerFencedException처음엔 이해가 안 갔다.작업은 5초면 끝나는데, 왜 60초 timeout이 나지?.. Spring/문제 해결 사례 2026. 4. 18. [Spring] 카프카 프로듀서 트랜잭션 동작 방식과 스프링 카프카 트랜잭션 실무 사례 (1) 🙋♂️ 카프카 프로듀서에서 카프카 트랜잭션이 필요한 이유는 무엇인가요?트랜잭션은 논리적으로 나눌 수 없는 작업 단위를 뜻해요.트랜잭션에 있는 작업은 모두 성공하거나 실패해야 해요.다르게 말하면 일부분만 완료해서는 안되는 작업 단위예요. 한 요구사항을 들어볼까요? 요구사항당신은 주문 시스템을 만드는 메이커예요!주문이 발생하면 다음 시스템에 이벤트를 전송 해야해요. 1. billing-events : 💵 결제 시스템2. inventory-events : 📦 재고 시스템3. notification-events : 🔔 알림 시스템 여러 토픽에 동시에 메시지를 전송해야 해요.이 중 하나라도 전송에 실패하면 업무의 의미가 사라져요!최종적 일관성을 달성하는 것보다 실패를 빠르게 알리는 게 중요해요.소비한.. Spring/기술 레시피 2025. 5. 7. jOOQ multiset 일대다 관계를 중첩 컬렉션으로 매핑 / 내부 동작 이해로 성능 이슈 파악하기 레시피 목표jOOQ multiset 연산으로 일대다 관계를 컬렉션 필드로 매핑시키기multiset 함수 내부 동작 이해로 성능 이슈 고려하기 TL; DR;JOOQ multiset 연산으로 일대다 관계를 컬렉션 필드로 매핑할 수 있습니다.서브 쿼리로 구현되기에 성능 병목 위험성 파악을 위해, 드리븐 테이블에서 매핑될 레코드 증가율을 유심히 살펴볼 필요가 있습니다.서브쿼리로 연결되는 드리븐 테이블의 매핑될 레코드 수가 적을 것으로 예상된다면, 성능 걱정 없이 간편하게 필드를 매핑시킬 수 있습니다. 실습 자료 소개 blogRepository/jooq-multiset at main · kor-Chipmunk/blogRepositoryContribute to kor-Chipmunk/blogRepository de.. Spring/기술 레시피 2025. 3. 20. 이전 1 다음