본문 바로가기
Error

[MySQL]Lock wait timeout exceeded; try restarting transaction

by kkaboo 2024. 2. 1.
728x90

 

🔍 원인

사용하고 있는 테이블에 Lock이 걸려 있는 상태에서 다른 세션의 사용자가 같은 테이블에서 작업을 수행 할 때, Lock 대기시간이 초과되면 발생하는 에러이다.

 

💡 해결

해결 방법은 Lock을 확인하고 세션을 죽여주면 된다.

잠자고 있는 프로세스들

 

현재 이상이 있는 프로세스들을 조회 해주고

-- 프로세스 리스트 표시
SHOW PROCESSLIST

-- 락테이블 조회
select * from information_schema.innodb_locks;

-- 대기중인 락 조회
select * from information_schema.innodb_lock_waits;

-- 트랜잭션조회
select * FROM information_schema.INNODB_TRX;

 

명령어를 통해 강제로 종료시켜준다.

-- KILL
KILL 1234567; -- KILL pid

-- KILL(AWS RDS)
CALL mysql.rds_kill(1234567); -- CALL mysql.rds_kill(pid);

 

 

❗ 주의점

개발 시 세션 kill로 인한 리스크가 있는 경우라면 같은 테이블을 사용하는 협업자 분에게 commit또는 rollback을 부탁하는게 가장 좋다.

자사 프레임워크에서 확인가능한 세션상태. 누가 락잡고 있는지 다 들킨다 ㅇㅅㅇ

 

 

개발 중에는 위와 같이 해결해 줄 수 있지만, 실제 사용자들이 사용할 때는 에러가 발생하지 않도록 Lock 대기 시간을 늘려주거나 쿼리 또는 로직에서 트랜잭션 에러에 대비하는 코드를 짜주어야 한다.

728x90