Truncate Loop DeadLock 트러블 슈팅
문제 정의
- Loop를 이용하여 Truncate를 하는 도중 DeadLock 이슈 발생
원인 추론
- Truncate는 데이터를 삭제하고, 테이블을 재설정하고 관련된 모든 트랜잭션 로그를 제거한다.
- 잠금 순서의 불일치
- 자동 커밋과 트랜잭션 관리가 필요 할 수 있다.
- 외래 키 제약조건에 의해 추가적인 잠금 때문에 발생 할 수 있다.
조치 및 방안 검토
- 명시적 트랜잭션 사용
- 모든 TRUNCATE 명령을 하나의 트랜잭션 내에서 수행하여 일관된 잠금 순서를 보장할 수 있다.
- 이를 통해 데드락의 가능성을 줄일 수 있다.
- 그러나 명시적 트랜잭션을 사용하게 되면 일일이 작성 해야 되는 불편함이 있어서 이 방법은 사용을 못 할 것 같다.
- 잠금 순서 일관성 유지
- 루프를 통해 여러 테이블을 TRUNCATE할 때는 항상 동일한 순서로 잠금을 걸도록 코드를 작성해야 한다.
- 현재도 동일한 순서로 코드를 작성하도록 해놓은 상태이다.
- 명시적 잠금 방법을 변경했으나 조치가 안되었다.
- 병렬 실행 피하기
- 여러 스레드나 프로세스에서 동시에 TRUNCATE 명령을 실행하지 않도록 한다.
- 이게 문제였었다.
- 외래 키 비활성화
결과 관찰 문제 해결 여부
- 확인 결과 따로 돌아가는 프로그램에 의해서 데드락 이슈가 발생했었다.
- 해당 프로그램을 종료 후에 정상적으로 동작이 되었다..
DeadLock이란?
- 트랜잭션 교착 상태를 의미한다.
트랜잭션이란?
- 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위
트랜잭션의 특징
- 원자성 : 모두 반영되거나 모두 반영 되지 말아야한다.
- 일관성 : 트랜잭션 이후의 상태는 일관적으로 유지되어야 한다.
- 독립성 : 다른 트랜잭션의 영향을 받으면 안된다.
- 영속성 : 트랜잭션의 상태는 영구히 보존되어야 한다.
독점잠금이란?
다른 트랜잭션의 접근 차단
- 독점적인 잠금을 획득한 트랜잭션이 완료될 때까지 다른 트랜잭션은 해당 리소스에 대한 읽기 및 쓰기 접근이 차단된다.
- 이는 데이터의 일관성과 무결성을 유지하기 위한 중요한 메커니즘이다.
높은 우선순위
- 독점적인 잠금은 다른 잠금 모드보다 우선순위가 높다.
- 다른 트랜잭션들이 해당 리소스에 접근하려 할 때 대기 상태에 놓이게 된다.
데드락 위험
- 독점적인 잠금은 강력한 잠금 방식이다.
- 여러 트랜잭션이 교차로 잠금을 시도할 경우 데드락이 발생할 가능성이 높아진다.
출처
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.