Deadlock found when trying to get lock; try restarting transaction
MySQL 오류 1213을 잠금 대기 시간 초과 오류와 구분하고 교착 상태가 발생한 트랜잭션을 확인하는 방법을 설명합니다.
빠른 답변
- 우선 확인할 원인
- MySQL 오류 1213은 InnoDB가 트랜잭션 사이의 교착 상태를 감지해 한 트랜잭션을 자동으로 롤백했다는 뜻입니다. 오류 번호 1213과 SQLSTATE 40001을 확인하고, 잠금 획득 순서가 코드 경로마다 다른지 비교해야 합니다.
- 먼저 확인할 항목
- 화면 또는 로그의 오류 번호가 `1213`인지 확인합니다.
- 적용 범위
- 현재 증상과 본문에 적은 관찰 조건이 함께 확인된 경우
- 출처
- MySQL
- 출처 확인일
- 2026-08-29
- 최종 검토
- 2026-08-29
- 수정일
- 2026-08-29
- 정정 이력
- 2026-07-29 이후 기록 없음
- 관련 기술
현재 증상
- 애플리케이션 오류 메시지
먼저 확인할 항목
화면 또는 로그의 오류 번호가 `1213`인지 확인합니다.
SQLSTATE가 `40001`인지 확인합니다.
오류 메시지가 `Deadlock found when trying to get lock; try restarting transaction`과 일치하는지 확인합니다.
오류가 발생한 시각과 해당 트랜잭션의 SQL 실행 순서를 기록합니다.
피해야 할 조치
주의
- 오류 1205의 잠금 대기 시간 초과와 혼동하지 않습니다.
- 중복 실행에 안전한지 확인하지 않은 트랜잭션을 자동 재시도하지 않습니다.
- 소유자와 영향을 확인하지 않은 세션을 임의로 종료하지 않습니다.
환경별 원인과 조치
오류 식별
다음 세 값을 함께 확인합니다.
- 오류 번호
1213 - SQLSTATE
40001 - 오류 메시지
Deadlock found when trying to get lock; try restarting transaction
세 값이 일치하면 MySQL ER_LOCK_DEADLOCK입니다. 오류가 난 시각, 트랜잭션 안에서 실행한 SQL 순서, 대상 테이블을 기록합니다. SQL 값에 포함된 개인정보와 인증 정보는 제거합니다.
오류 1205와 차이
| 구분 | 오류 1213 | 오류 1205 |
|---|---|---|
| 조건 | InnoDB가 교착 상태를 감지함 | 행 잠금을 설정된 시간 안에 얻지 못함 |
| SQLSTATE | 40001 | HY000 |
| 기본 롤백 범위 | 선택된 트랜잭션 전체 | 기다리던 SQL 문 |
| 첫 확인 | 트랜잭션별 잠금 획득 순서 | 대기·차단 트랜잭션과 잠금 보유 시간 |
오류 1205라면 Lock wait timeout exceeded; try restarting transaction 문서를 확인합니다.
확인 순서
- 오류가 난 트랜잭션의 SQL 실행 순서를 기록합니다.
- 같은 행 또는 테이블을 갱신하는 다른 트랜잭션의 실행 순서와 비교합니다.
- 코드 경로마다 같은 자원을 서로 다른 순서로 잠그는지 확인합니다.
- 긴 트랜잭션 안에 외부 API 호출이나 파일 처리처럼 데이터베이스 밖의 작업이 포함됐는지 확인합니다.
- 잠금 획득 순서를 일관되게 수정한 뒤 같은 동시 실행 조건에서 재발 여부를 확인합니다.
MySQL은 교착 상태에서 선택한 트랜잭션을 자동으로 롤백합니다. 재시도는 트랜잭션 전체 작업이 중복 실행돼도 안전한지 확인한 뒤 제한된 횟수와 간격으로 적용합니다.
출처
참고 자료
MySQL · 공식 자료 · 확인 범위: 오류 번호 1213의 Symbol은 ER_LOCK_DEADLOCK이고 SQLSTATE는 40001입니다., 오류 메시지는 "Deadlock found when trying to get lock; try restarting transaction"입니다., InnoDB는 교착 상태를 감지하면 한 트랜잭션을 자동으로 롤백합니다., 교착 상태가 반복되면 트랜잭션 사이의 잠금 획득 순서를 일관되게 구성해야 합니다. · 확인일: 2026-08-29