[바로] DeadLock 범인 찾기 (Ft. 위험한 FK?)
·
프로젝트
Part 1. DeadLock 현상 발생단일 품목 주문 API 부하테스트를 진행하면서 아래와 같이 응답이 실패함을 확인할 수 있었다 실패의 원인을 찾는데는 APM 툴로 Pinpoint를 사용하고 있었기에 크게 어렵지 않았다. 모니터링한 결과, DeadLock이 빈번하게 발생하고 있음을 확인했다. 위의 사진에서 보다시피 CannotAcquireLockException이 반복적으로 나타나고 있으며, 특히 HikariCP 데이터베이스 연결 풀에서 2,443ms 동안 대기하는 것을 볼 수 있다. 지금부터 DeadLock이 왜 발생했는지 찾아보자! Part 2. 문제 원인 분석현재 주문 처리의 핵심 플로우는 다음과 같다. Orders와 Order_items 테이블에 순차적으로 INSERT를 수행한..
[바로] 단일 주문 성능 개선 삽질기 (Ft. JPA save, FK)
·
프로젝트
상품을 주문하는 행위는 E-Commerce 도메인에서 가장 중요한 기능 중 하나이다. 먼저 재고 관리 측면에서 예를 들면, 남은 재고는 10개였으나 12개의 주문이 발생할 수 있다. 이로 인해 사용자는 결제까지 모두 완료한 이후에 결제가 취소되는 상황을 겪거나 브랜드 측에서 추가 발주를 진행해야하는 상황이 발생할 수 있다. 전자는 사용자에게 서비스가 불쾌한 경험으로 남을 수 있고, 후자는 브랜드 측에서 서비스에 불신을 가질 수 있으며 추가 발주라는 예상치 못한 상황으로 인해 리소스가 발생할 수 있다 블랙프라이데이나 한정판 의류 같은 경우 매우 높은 트래픽이 발생 가능한 상황을 고려해야 하며, 동시성 문제로 인한 데이터 정합성 문제가 발생하면 안된다. 즉, 이를 해결하지 못한다면 서비스의 가치를 떨어뜨리고..
Auto Increment를 막쓰면 문제가 될 수도..?(with Lock)
·
Spring/JPA
1. 언제 Auto Increment를 사용할 때 문제가 발생하나요?예시 시나리오logs 테이블에는 id 컬럼이 있고, AutoIncrement로 설정되어 있다현재 id의 최댓값이 4라고 가정한다P1 트랜잭션이 시작되어 insert를 3번 실행 → 부여된 ID: 5, 6, 7하지만 아직 P1 트랜잭션은 커밋되지 않은 상태이다동시에 P2, P3도 각각 insert 실행 → 부여된 ID: 8, 9 (이들은 트랜잭션을 커밋함) 문제가 발생할 수 있는 상황이전에 처리한 최대 ID를 구해 lastProcessedId에 저장 (예: 4)현재의 최대 ID를 구해 maxId에 저장 (예: 9)lastProcessedId보다 크고 maxId보다 작거나 같은 ID 목록을 조회해 ids에 저장 (이 시점에는 DB에서 [8,..
chobo99
'MySQL' 태그의 글 목록