mySQL DeadLock 해결

JinWooHyun·2021년 7월 18일
0

트랜잭션 중 DB 상에서 Lock wait timeout exceeded; try restarting transaction 에러를 내뿜으면서 작동이 안되는 상황이 발생하였다.

구글링 해보니 방법은

  1. Lock Timeout 시간 늘리기
  2. Lock을 잡고있는 프로세스 제거

두 가지가 있는데, 1의 설정을 변경해야 해결되는 문제는 아닐 거 같아 Lock을 잡고있는 프로세스를 찾아보았다.

문제가 발생했던 프로세스 그대로 진행 후 아래의 쿼리를 하여 찾아보니

# Lock을 가지고 있는 트랜젝션
SELECT * FROM information_schema.INNODB_LOCKS ;

# 아직 LOCK을 얻지 못하고 기다리고 있는 트렌젝션
SELECT * FROM information_schema.INNODB_LOCK_WAITS ;

# 오랜 시간 동안 Commit 되지 않은 트렌젝션
SELECT * FROM information_schema.INNODB_TRX ;

첫 두 테이블에는 결과가 없었지만 문제가 발생한 트랜잭션을 재시도하니 생겼다가 다시 사라졌고,INNODB_TRX 테이블에 문제가 발생한 프로그램 실행 여부와 상관없이 해당 LOCK이 계속 존재하는 것이 확인 되었다. 즉, 다른 프로그램에 의해 해당 LOCK이 발생을 하였고, 이 LOCK으로 인해 정상적으로 수행되어야 하는 프로그램에 문제가 발생한 것.

해결을 위해 INNODB_TRX 테이블에 명시되어 있는 trx_mysql_thread_id의 프로세스 id를 찾아 강제 종료 시키면 된다.

SELECT * FROM information_schema.processlist WHERE id = <trx_mysql_thread_id>

kill <trx_mysql_thread_id>
profile
Unicorn Developer

0개의 댓글