Lock wait timeout exceeded 에러가 발생하는 대표적인 상황을 MySQL에서 직접 재현해봤다.
CREATE TABLE accounts (
id INT PRIMARY KEY,
balance INT
) ENGINE=InnoDB;
INSERT INTO accounts VALUES (1, 100), (2, 100);
START TRANSACTION;
UPDATE accounts SET balance = balance - 10 WHERE id = 1;
-- 여기서 COMMIT 하지 말고 대기!
START TRANSACTION;
UPDATE accounts SET balance = balance + 20 WHERE id = 1;
Lock wait timeout exceed
에러 발생원인) Session A가 UPDATE를 실행한 후 트랜잭션을 종료하지 않았기 때문
Session A 에서 빠르게 커밋하기
COMMIT;
커밋 → 락 해제 → Session B는 update 쿼리 실행 가능
🚨 명시적으로 트랜잭션을 시작했을 때(
START TRANSACTION
)을 사용했을 때는
“트랜잭션의 끝을 명확히 닫아주는 것”이 매우 중요하다.
그렇지 않으면 락이 유지되며 다른 트랜잭션이 블로킹되거나 타임아웃으로 이어질 수 있다.