Error & 해결방법

Deadlock found when trying to get lock; try restarting transaction 오류

Dev.Congsik 2025. 1. 2. 17:18
728x90

데드락은 데이터베이스에서 두 개 이상의 트랜잭션이 서로 자원을 점유한 상태에서, 상대방이 점유한 자원을 요청하며 무한 대기 상태에 빠지는 상황을 말합니다.
결과적으로 이 상태에서는 트랜잭션이 진행되지 못하며, 데이터베이스는 교착 상태를 해결하기 위한 조치를 취하지 않으면 정상 작동에 장애가 발생합니다.


Deadlock 발생 과정

  1. 트랜잭션 A와 B의 동시 실행:
    • 트랜잭션 A가 자원 X를 잠그고, 이후 자원 Y를 요청.
    • 동시에 트랜잭션 B가 자원 Y를 잠그고, 이후 자원 X를 요청.
  2. 자원 충돌:
    • 트랜잭션 A는 자원 Y를 점유한 트랜잭션 B를 기다리고,
    • 트랜잭션 B는 자원 X를 점유한 트랜잭션 A를 기다립니다.
  3. Deadlock 발생:
    • 두 트랜잭션이 서로 상대방의 자원을 기다리며 대기 상태에 빠지고, 진행이 불가능해집니다.

 

 

 

Deadlock found when trying to get lock; try restarting transaction 오류는 두 개 이상의 트랜잭션이 동일한 리소스에 대해 서로 락을 기다리면서 발생한 교착 상태를 나타냅니다. MariaDB나 MySQL 같은 데이터베이스에서는 트랜잭션 충돌이 발생할 경우 교착 상태를 자동으로 감지하고 트랜잭션 중 하나를 강제로 중단합니다. 이로 인해 애플리케이션 측에서는 예외가 발생하게 됩니다.

주요 오류 내용

Deadlock found when trying to get lock; try restarting transaction CannotAcquireLockException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement

- 이 오류는 Hibernate가 트랜잭션을 시작하려 했으나, 다른 트랜잭션이 해당 리소스를 이미 점유하고 있어 Lock을 획득하지 못해 발생했습니다.

 

해결 방안

  1. 트랜잭션 격리 수준 조정:
    • 트랜잭션의 격리 수준을 낮추면 교착 상태를 줄일 수 있습니다. Spring Boot에서는 @Transactional(isolation = Isolation.READ_COMMITTED) 또는 Isolation.READ_UNCOMMITTED로 설정할 수 있습니다.
    • 단, 격리 수준을 낮추는 것은 데이터 정합성에 영향을 미칠 수 있으므로 주의가 필요합니다.
  2. 락 시간이 긴 쿼리 최적화:
    • Deadlock의 주요 원인은 데이터베이스 테이블에서 긴 시간 동안 락을 차지하는 쿼리입니다. 조회 시간이 오래 걸리는 쿼리를 식별하여 인덱스를 추가하거나 쿼리 구조를 개선하는 것이 좋습니다.
    • 또한, JOIN이 많은 복잡한 쿼리나 큰 데이터 양을 처리하는 UPDATE, DELETE 문을 최적화하여 교착 상태 발생 가능성을 줄일 수 있습니다.
  3. 짧은 트랜잭션 유지:
    • 트랜잭션이 길어지면 다른 트랜잭션이 리소스를 기다리며 교착 상태가 발생할 확률이 높아집니다. 각 트랜잭션의 범위를 최소화하여 데이터베이스 락을 짧게 유지하는 것이 좋습니다.
  4. 자동 재시도 설정:
    • Deadlock은 시스템 부하가 높거나 일시적으로 발생할 수 있으므로, Spring에서 자동으로 트랜잭션을 재시도하도록 설정할 수 있습니다.
    • @Transactional 어노테이션과 함께 @Retryable을 사용하거나 재시도 로직을 추가하여 Deadlock 발생 시 자동으로 트랜잭션을 다시 시도하게 할 수 있습니다.
  5. 배치 작업 분할:
    • 만약 배치 작업이나 대량 데이터 업데이트가 Deadlock을 유발하고 있다면, 이를 여러 개의 작은 트랜잭션으로 나누어 실행하면 문제가 완화될 수 있습니다.
728x90