DB 데드락

Moondy·2022년 5월 13일
0

개념

  • 트랜잭션(프로세스 ID 57)이 잠금 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다". 트랜잭션을 다시 실행하십시오. 와 같은 에러가 발생했다면 데드락이 발생한것
  • 둘 이상의 트랜잭션이 다른 프로세스가 점유하고 있는 자원을 서로 기다리면서 무한 대기에 빠지는 상황
  • 각 트랜잭션이 가지고 있는 리소스의 Lock을 획득하려고 할 때 발생
  • 각 트랜잭션 접근 테이블 순서가 달라 순환 대기 상태에 빠졌기 때문

💡 트랜잭션(Transaction): 하나의 작업을 수행하는 데 필요한 데이터 베이스의 연산을 모아놓은것, 데이터 베이스 작업의 단위

해결방법

  • 트랜잭션 진행방향을 같은 방향으로 처리 (접근하는 테이블 순서를 같도록 변경)
  • 트랜잭션 처리 속도를 최소화. 즉, 테이블을 lock 한 상태에서 처리되는(commit)속도가 빠르면 다른 트랜잭션에서 테이블이 잠길 시간이 없음
  • SET_LOCK_TIMEOUT문을 이용하여 잠금 해제 시간을 조절
    • 무한대기 하지 않고 시간 만료되면 다음 작업을 진행할 수 있도록 하는것
  • 한 테이블의 복수행을 연결해서 갱신하지 말고, 테이블 단위의 잠금을 획득해 갱신을 직렬화 하기. 동시성은 떨어지지만 한 테이블을 lock하고 있는 시간을 단축시켜 dead lock을 피할 수 있다
profile
DevOps를 살짝 찍먹하는 BackEnd 개발자

0개의 댓글