Lock wait timeout exceeded; try restarting transaction
MySQL 오류 1205를 확인하고 잠금을 기다린 트랜잭션과 차단한 트랜잭션을 구분하는 방법을 설명합니다.
빠른 답변
- 우선 확인할 원인
- MySQL 오류 1205는 InnoDB 트랜잭션이 행 잠금을 설정된 시간 안에 얻지 못했다는 뜻입니다. 기본 설정에서는 기다리던 SQL 문만 롤백되므로, 재시도 전에 현재 트랜잭션 상태와 차단 트랜잭션을 확인해야 합니다.
- 먼저 확인할 항목
- 화면 또는 로그의 오류 번호가 `1205`인지 확인합니다.
- 적용 범위
- 현재 증상과 본문에 적은 관찰 조건이 함께 확인된 경우
- 출처
- MySQL
- 출처 확인일
- 2026-08-29
- 최종 검토
- 2026-08-29
- 정정 이력
- 2026-07-29 이후 기록 없음
- 관련 기술
현재 증상
- 애플리케이션 오류 메시지
먼저 확인할 항목
화면 또는 로그의 오류 번호가 `1205`인지 확인합니다.
화면 또는 로그의 SQLSTATE가 `HY000`인지 확인합니다.
오류 메시지가 `Lock wait timeout exceeded; try restarting transaction`과 일치하는지 확인합니다.
오류가 발생한 시각, SQL 문, 대상 테이블, 요청 또는 작업 식별자를 기록합니다.
권한이 있으면 `performance_schema.data_lock_waits`에서 대기·차단 트랜잭션과 스레드 식별자를 확인합니다.
피해야 할 조치
주의
- 오류 직후 전체 트랜잭션이 자동으로 롤백됐다고 가정하지 않습니다.
- 원인을 확인하지 않은 채 `innodb_lock_wait_timeout`을 크게 늘리지 않습니다.
- 소유자와 업무 영향을 확인하지 않은 세션을 종료하거나 트랜잭션을 임의로 커밋·롤백하지 않습니다.
환경별 원인과 조치
확인
화면 또는 로그에서 다음 값을 확인합니다.
- 오류 번호가
1205인지 확인합니다. - SQLSTATE가
HY000인지 확인합니다. - 오류 메시지가
Lock wait timeout exceeded; try restarting transaction과 일치하는지 확인합니다.
세 값이 일치하면 MySQL ER_LOCK_WAIT_TIMEOUT 오류입니다. 오류가 난 시각, 실행한 SQL 문, 대상 테이블, 요청 또는 작업 식별자도 함께 기록합니다. 비밀번호와 개인정보는 로그에서 제거합니다.
의미
InnoDB 트랜잭션이 다른 트랜잭션이 보유한 행 잠금을 설정된 시간 안에 얻지 못했을 때 발생합니다. 기본 설정에서는 너무 오래 기다린 SQL 문만 롤백되며, 전체 트랜잭션이 자동으로 롤백된 것은 아닙니다.
따라서 오류 문구에 try restarting transaction이 있더라도 즉시 재시도하기 전에 애플리케이션이 현재 트랜잭션을 명시적으로 롤백했는지 확인해야 합니다.
대기와 차단 관계 확인
MySQL 8.0 이상에서 조회 권한이 있으면 다음 읽기 전용 조회로 현재 잠금 대기 관계를 확인합니다.
SELECT REQUESTING_ENGINE_TRANSACTION_ID, REQUESTING_THREAD_ID, BLOCKING_ENGINE_TRANSACTION_ID, BLOCKING_THREAD_IDFROM performance_schema.data_lock_waits;결과는 조회 시점의 상태입니다. 오류가 끝난 뒤에는 행이 사라질 수 있으므로, 오류 시각의 애플리케이션 로그와 데이터베이스 관측 자료를 함께 비교합니다.
| 관찰값 | 다음 확인 |
|---|---|
| 같은 차단 트랜잭션이 여러 요청을 막음 | 트랜잭션 시작 시각과 커밋·롤백 누락 여부를 확인합니다. |
| 특정 UPDATE가 반복해서 대기함 | 여러 코드 경로가 같은 행을 다른 순서로 갱신하는지 확인합니다. |
| 잠금 대기 관계가 이미 사라짐 | 오류 시각의 SQL 로그와 트랜잭션 범위를 비교합니다. |
| 테이블 잠금 또는 메타데이터 잠금이 의심됨 | 이 오류의 행 잠금 절차와 구분해 별도로 확인합니다. |
조치 원칙
- 애플리케이션이 오류가 난 트랜잭션을 명시적으로 롤백하는지 확인합니다.
- 차단한 트랜잭션이 정상 업무인지, 비정상적으로 오래 열린 것인지 확인합니다.
- 트랜잭션 안의 외부 API 호출이나 긴 계산처럼 잠금 보유 시간을 늘리는 작업이 있는지 확인합니다.
- 재시도가 허용되는 작업인지와 중복 실행 방지 조건을 확인한 뒤 제한적으로 재시도합니다.
- 수정 후 같은 입력에서 오류 재발 여부와 잠금 대기 시간을 다시 측정합니다.
innodb_lock_wait_timeout 증가는 차단 원인을 제거하지 않습니다. 세션 종료나 강제 롤백도 다른 요청의 데이터 변경을 중단할 수 있으므로 담당자가 트랜잭션 소유자와 영향을 확인한 뒤 결정합니다.
출처
참고 자료
MySQL · 공식 자료 · 확인 범위: 오류 번호 1205의 Symbol은 ER_LOCK_WAIT_TIMEOUT이고 SQLSTATE는 HY000입니다., 오류 메시지는 "Lock wait timeout exceeded; try restarting transaction"입니다., InnoDB는 잠금 대기 시간이 만료되면 이 오류를 보고합니다., 너무 오래 대기한 SQL 문은 롤백되지만 전체 트랜잭션은 롤백되지 않습니다. · 확인일: 2026-08-29
MySQL · 공식 자료 · 확인 범위: innodb_lock_wait_timeout은 InnoDB 트랜잭션이 행 잠금을 기다리는 시간을 초 단위로 정합니다., 기본 설정에서는 시간 초과가 발생한 SQL 문만 롤백됩니다., 이 설정은 InnoDB 행 잠금에 적용되며 MySQL 테이블 잠금에는 적용되지 않습니다. · 확인일: 2026-08-29
MySQL · 공식 자료 · 확인 범위: data_lock_waits는 요청한 잠금과 이를 차단한 잠금의 관계를 보여줍니다., 대기·차단 트랜잭션과 스레드 식별자를 확인할 수 있습니다. · 확인일: 2026-08-29