Lock wait timeout exceed 에러 상황 재현

별빛사막·2025년 7월 16일
0
post-thumbnail

Lock wait timeout exceeded 에러가 발생하는 대표적인 상황을 MySQL에서 직접 재현해봤다.

전체 조건

  • MySQL 서버에서 InnoDB 스토리지 엔진 사용
  • innodb_lock_wait_timeout: 50초(기본값)
  • 두 개의 터미널/세션을 사용해 실행

테스트 과정

1. 테스트 테이블 생성

CREATE TABLE accounts (
    id INT PRIMARY KEY,
    balance INT
) ENGINE=InnoDB;

INSERT INTO accounts VALUES (1, 100), (2, 100);

2. Session A: 트랜잭션 시작 후 레코드 잠금

START TRANSACTION;
UPDATE accounts SET balance = balance - 10 WHERE id = 1;
-- 여기서 COMMIT 하지 말고 대기!
  • id = 1 행에 쓰기 잠금 (exclusive lock) 이 걸린다.
  • 트랜잭션을 커밋하지 않았기 때문에 락은 유지된다.

3. Session B: 같은 레코드에 접근 시도

START TRANSACTION;
UPDATE accounts SET balance = balance + 20 WHERE id = 1;
  • id = 1은 이미 Session A에서 락을 걸고 있으므로, Session B는 락 해제를 기다리며 대기 상태에 빠진다.

4. 일정 시간 후 Lock wait timeout exceed 에러 발생

에러 발생

  • 기본 설정 기준 50초 이상 대기하면 위와 같은 에러가 발생한다.

문제 발생 원인

원인) Session A가 UPDATE를 실행한 후 트랜잭션을 종료하지 않았기 때문

  • 트랜잭션이 종료되지 않으면 락은 계속 유지되며, 다른 트랜잭션은 해당 레코드에 접근할 수 없다.
  • Session B는 락을 얻기 위해 기다리다 해당 에러가 발생했다.

해결방법

Session A 에서 빠르게 커밋하기

COMMIT;

커밋 → 락 해제 → Session B는 update 쿼리 실행 가능

🚨 명시적으로 트랜잭션을 시작했을 때(START TRANSACTION)을 사용했을 때는
“트랜잭션의 끝을 명확히 닫아주는 것”이 매우 중요하다.
그렇지 않으면 락이 유지되며 다른 트랜잭션이 블로킹되거나 타임아웃으로 이어질 수 있다.

profile
조금씩 매일 성장하자

0개의 댓글