문제 정의

다수의 약속 참여자가 동시 다발적으로 일정 등록 요청을 하는 순간에 schedule 테이블에서 데드락이 발생하는 문제를 발견했습니다.

image.png

image.png

MySQL은 InnoDB 스토리지 엔진의 내부 상태 정보를 확인할 수 있는 show engine innodb status\\G; 명령어를 제공합니다. 이를 사용하여 가장 마지막에 발생한 데드락 정보를 확인할 수 있습니다.

데드락은 두 개 이상의 트랜잭션이 서로의 자원(락)을 얻기위해 대기하며, 영원히 진행되지 못하는 상황을 말합니다.

TX-1(66308)TX-2(66039) 가 schedule 테이블에 일정을 삽입하는 과정에서 데드락이 발생했고, InnoDB 스토리지 엔진이 데드락을 해결하기 위해 TX-1(66308)을 종료(롤백)시켰습니다.

문제 발생 원인

로그 분석

로그를 분석하면 다음과 같습니다.

두 참여자가 (attendee_id = 10408, 10407) 일정을 등록하기 위해 트랜잭션-1(66038)과 트랜잭션-2(66039)를 실행했습니다.

트랜잭션-2 내용도 트랜잭션-1과 완전히 동일합니다.