데드락 실제 사례: Database Transaction Deadlock

아투·2026년 5월 28일

Operation System

목록 보기
14/22
post-thumbnail

Database Transaction Deadlock

마이크로서비스 환경에서 주문 처리 시스템을 개발 중, 다음과 같은 데드락이 발생하는 상황

// Transaction A
@Transactional
public void updateInventory(Long productId, int quantity) {
    // 1. product 테이블 락 획득
    productRepository.findByIdForUpdate(productId);
    
    // 2. inventory 테이블 락 시도
    inventoryRepository.updateQuantity(productId, quantity);
}

// Transaction B (동시 실행)
@Transactional
public void updateProductPrice(Long productId, BigDecimal price) {
    // 1. inventory 테이블 락 획득
    inventoryRepository.findByProductIdForUpdate(productId);
    
    // 2. product 테이블 락 시도
    productRepository.updatePrice(productId, price);
}
  • **원인 및 해결방법
    • 두 트랜잭션이 서로 다른 순서로 테이블에 락을 걸어 데드락이 발생.
    • 항상 동일한 순서로 락을 획득하도록 수정.
@Transactional
public void updateInventoryAndProduct(Long productId, int quantity, BigDecimal price) {
    // 항상 product 테이블 -> inventory 테이블 순서로 락 획득
    productRepository.findByIdForUpdate(productId);
    inventoryRepository.findByProductIdForUpdate(productId);
    
    // 실제 업데이트 수행
    if (quantity != 0) {
        inventoryRepository.updateQuantity(productId, quantity);
    }
    if (price != null) {
        productRepository.updatePrice(productId, price);
    }
}

0개의 댓글