Lock wait timeout exceeded 오류가 계속 발생했다. 이전의 경험으로 해당 오류는 한 스크립트에서 커밋을 하지 않고 다른 스크립트에서 작업 시 발생했었다.
그런데 이번에는 그런 것도 아니었다. 그래서 다른 작업자에게 DB 데이터 수정하고 있는지 확인했는데, 아니라고 했다.
에러 해결하기
아래 쿼리문으로 현재 lock 이 걸린 테이블이 뭔지 조회해봤다. 그런데 아무것도 나타나지 않았다. 서치 후 확인해보니, 실제 문제가 발생한 프로그램을 실행중일 때 아래 쿼리문으로 조회가 가능한 것이었다.
SELECT * FROM information_schema.INNODB_LOCK_WAITS
SELECT * FROM information_schema.innodb_locks;
INNODB_LOCK_WAITS 에서는 한 개, INNODB_LOCKS 에서는 두 개 나타났다.
보안 상 데이터를 첨부하지는 못하지만, 특정 트랜잭션으로 인해 레코드가 삽입되었고(‘X’), 동일한 레코드에 대해 또 다른 트랜잭션에서 선택(‘S’)된 것을 보여준다. LOCK_MODE 정보를 통해 확인이 가능하다.
프로그램 처리 중에 이전 처리분이 COMMIT 이나 ROLLBACK 이 동작하지 않았다는 것을 알 수 있다. 실제로 확인해보니, 해당 프로시저에 에러 시 ROLLBACK 처리문이 빠져있었다.
아무튼 이 프로세스를 종료해야 내가 다시 작업을 이어갈 수 있다. TRX 테이블에서 TRX_ID 로 계속 존재하는 것을 확인할 수 있다. 해당 아이디가 INNODB_LOCKS 의 LOCK_ID 와 동일한지 확인하고 종료했다.
select * from information_schema.INNODB_TRX
TRX 테이블에서 TRX_MYSQL_THREAD_ID 를 확인하고 해당 프로세스를 종료하면 된다.
KILL 프로세스ID
참고자료
https://www.popit.kr/mysql-lock-%EC%83%81%ED%99%A9-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0/
MySQL Lock 상황 문제 해결 | Popit
Lock wait timeout exceeded; try restarting transaction 문제 발생 시 어떻게 해결했는지 과정에 대해 설명한 글입니다.
www.popit.kr