[MySQL] DeadLock

기훈·2024년 7월 16일

MySQL

목록 보기
4/23

MySQL 데드락 예시

  • 왜 S-Lock를 먼저 걸고, X-Lock를 걸어야 하는가 ?
    PK는 유니크 제약 보장을 위해서, DML은 레코드 존재시 S-Lock 필요

  • 어떻게 삭제된 레코드에 대해서 Lock를 걸수 있는가 ?
    - 레코드는 삭제되더라도 일정 기간동안 Deletion-mark만 설정

MySQL 데드락 감지

  • DeadLock detection thread가 모든 트랜잭션이 획득 또는 대기하고 있는 잠금 Graph를 계속 감시한다.
  • 동시 트랜잭션이 많은 경우, deadlock 체크 작업으로 인한대기 발생 (따라서 DeadLock detection thread를 비활성화 하기도 한다)
    - inoodb_deadlock_detect = OFF
    • inoodb_lock_wait_timeout 기본값은 50초

MySQL 데드락 처리

  • MySQL은 롤백이 쉬운 트랜잭션을 Victim trx로 선정
    - 롤백이 쉽다 == undo 레코드가 적은 트랜잭션

  • Victim으로 선정된 트랜잭션은 강제 롤백 처리됨

  • 남은 트랜잭션은 정상 처리

  • 이러한 이유로 배치작업과 서비스 쿼리가 경합하면, 항상 배치가 살아남음

MySQL 데드락 해석 어려움

  • 같은 쿼리여도 동일한 잠금을 사용하지 않음

  • 레코드 뿐만아니라 레코드 간격도 잠금 대상

  • 데드락의 모든 시점을 로깅하지 않음

  • 잠금의 대상은 모든 인덱스 키

  • MySQL 데드락 해석은 매우 어렵다 !

0개의 댓글