포스트

Truncate Loop DeadLock 트러블 슈팅

문제 정의

  • Loop를 이용하여 Truncate를 하는 도중 DeadLock 이슈 발생

원인 추론

  • Truncate는 데이터를 삭제하고, 테이블을 재설정하고 관련된 모든 트랜잭션 로그를 제거한다.
  • 잠금 순서의 불일치
  • 자동 커밋과 트랜잭션 관리가 필요 할 수 있다.
  • 외래 키 제약조건에 의해 추가적인 잠금 때문에 발생 할 수 있다.

조치 및 방안 검토

  • 명시적 트랜잭션 사용
    • 모든 TRUNCATE 명령을 하나의 트랜잭션 내에서 수행하여 일관된 잠금 순서를 보장할 수 있다.
    • 이를 통해 데드락의 가능성을 줄일 수 있다.
    • 그러나 명시적 트랜잭션을 사용하게 되면 일일이 작성 해야 되는 불편함이 있어서 이 방법은 사용을 못 할 것 같다.
  • 잠금 순서 일관성 유지
    • 루프를 통해 여러 테이블을 TRUNCATE할 때는 항상 동일한 순서로 잠금을 걸도록 코드를 작성해야 한다.
    • 현재도 동일한 순서로 코드를 작성하도록 해놓은 상태이다.
    • 명시적 잠금 방법을 변경했으나 조치가 안되었다.
  • 병렬 실행 피하기
    • 여러 스레드나 프로세스에서 동시에 TRUNCATE 명령을 실행하지 않도록 한다.
    • 이게 문제였었다.
  • 외래 키 비활성화

결과 관찰 문제 해결 여부

  • 확인 결과 따로 돌아가는 프로그램에 의해서 데드락 이슈가 발생했었다.
  • 해당 프로그램을 종료 후에 정상적으로 동작이 되었다..

DeadLock이란?

  • 트랜잭션 교착 상태를 의미한다.

트랜잭션이란?

  • 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위

트랜잭션의 특징

  • 원자성 : 모두 반영되거나 모두 반영 되지 말아야한다.
  • 일관성 : 트랜잭션 이후의 상태는 일관적으로 유지되어야 한다.
  • 독립성 : 다른 트랜잭션의 영향을 받으면 안된다.
  • 영속성 : 트랜잭션의 상태는 영구히 보존되어야 한다.

독점잠금이란?

다른 트랜잭션의 접근 차단

  • 독점적인 잠금을 획득한 트랜잭션이 완료될 때까지 다른 트랜잭션은 해당 리소스에 대한 읽기 및 쓰기 접근이 차단된다.
  • 이는 데이터의 일관성과 무결성을 유지하기 위한 중요한 메커니즘이다.

    높은 우선순위

  • 독점적인 잠금은 다른 잠금 모드보다 우선순위가 높다.
  • 다른 트랜잭션들이 해당 리소스에 접근하려 할 때 대기 상태에 놓이게 된다.

데드락 위험

  • 독점적인 잠금은 강력한 잠금 방식이다.
  • 여러 트랜잭션이 교차로 잠금을 시도할 경우 데드락이 발생할 가능성이 높아진다.

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.