다수의 약속 참여자가 동시 다발적으로 일정 등록 요청을 하는 순간에 schedule
테이블에서 데드락이 발생하는 문제를 발견했습니다.
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)를 실행했습니다.
(1) HOLDS THE LOCK(S)
: 트랜잭션-1(66308)이 현재 보유하고 있는 락을 말합니다.
RECORD LOCKS space id 225 page no 291 n bits 824
index FK31w8m3wusrvyega2drfdh06bm of table momo.schedule trx id 66308 lock_mode X locks gap before rec
Record lock, heap no 628
(1) WAITING FOR THIS LOCK TO BE GRANTED
: 트랜잭션-1(66308)이 기다리고 있는 잠금을 의미합니다.
RECORD LOCKS space id 225 page no 291 n bits 824
index FK31w8m3wusrvyega2drfdh06bm of table momo.schedule trx id 66308 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 628
트랜잭션-2 내용도 트랜잭션-1과 완전히 동일합니다.