한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

게임 렉 백서 › L12 데이터베이스

DB 데드락 Database deadlock

원인 ID db-deadlock · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라

그림과 실험이 있는 원본 카드로 열기 →

두 트랜잭션(한 묶음으로 처리되는 DB 작업)이 서로 상대가 잠근 행을 기다리면 DB가 한쪽을 강제로 취소합니다.

왜 거래 A는 아이템→재화, B는 재화→아이템 순서로 잠금 → 그러면 DB가 데드락을 감지해 한쪽을 롤백 → 화면에서는 거래·제작이 가끔 실패, 아이템이 되돌아감

증상
씹힘·롤백, 입력 지연
요인
손실, 정체
누가 겪나
특정 기능만
언제
사람이 몰릴 때, 특정 행동을 할 때
담당
주 담당 게임개발팀·서버 개발 · 함께 인프라팀·DB 인프라
게임개발팀 할 일
잠금 순서 통일, 트랜잭션 짧게, 실패 시 자동 재시도.
인프라팀 할 일
데드락 감지를 켜 두고 데드락 기록을 수집해 공유, 감지를 끈 MySQL 서버는 잠금 대기 한도(기본 50초) 줄이기.
수치 감각
감지까지 MySQL(InnoDB)은 거의 즉시, PostgreSQL은 기본 1초, SQL Server는 최대 5초쯤 걸립니다. 그동안 두 요청 모두 멈춰 있습니다. 동시 요청이 아주 많아 MySQL의 감지를 꺼 둔 서버라면 잠금 대기 한도(기본 50초)까지 기다립니다.
그래프에서는
가끔 무작위로 튐 · 데드락 수, 거래 실패 수
확인할 곳
MySQL은 SHOW ENGINE INNODB STATUS의 LATEST DETECTED DEADLOCK(가장 최근 1건), innodb_print_all_deadlocks를 켜면 에러 로그에 남는 모든 데드락, INFORMATION_SCHEMA.INNODB_METRICS의 lock_deadlocks를 봄. PostgreSQL은 pg_stat_database의 deadlocks, SQL Server는 기본으로 켜진 system_health 세션의 xml_deadlock_report를 봄. 게임 서버 쪽 오류 코드는 MySQL 1213, PostgreSQL 40P01, SQL Server 1205
이러면 맞음
거래·제작 실패 시각에 데드락 수가 늘고 기록된 두 트랜잭션이 같은 테이블들을 서로 반대 순서로 잠그고 있음
이러면 아님
데드락 수는 그대로인데 실패하면 잠금 대기 한도 초과(MySQL 오류 1205)나 핫 로우(db-hot-row)
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. InnoDB Startup Options and System Variables MySQL
    감지가 켜져 있으면(기본) InnoDB는 데드락을 즉시 감지해 롤백, innodb_lock_wait_timeout 기본 50초
  2. Deadlock Detection MySQL
    동시성이 아주 높으면 감지 자체가 느려질 수 있어 끄고 잠금 대기 한도에 맡기기도 함
  3. Lock Management (PostgreSQL Documentation) PostgreSQL
    deadlock_timeout 기본 1초: 이만큼 잠금을 기다린 뒤에야 데드락 검사
  4. Deadlocks guide Microsoft SQL Server
    데드락 검사 기본 간격 5초, 데드락이 자주 나면 100ms까지 줄어듦, 기본으로 켜진 system_health 세션이 xml_deadlock_report를 수집, 희생된 쪽은 오류 1205
  5. How to Minimize and Handle Deadlocks MySQL
    여러 행·테이블은 늘 같은 순서로 고치기, 실패하면 다시 시도, innodb_print_all_deadlocks로 모든 데드락 기록
  6. InnoDB Standard Monitor and Lock Monitor Output MySQL
    LATEST DETECTED DEADLOCK: 가장 최근 데드락의 두 트랜잭션, 잡은·기다린 잠금, 롤백한 쪽
  7. InnoDB INFORMATION_SCHEMA Metrics Table MySQL
    INNODB_METRICS의 lock_deadlocks 카운터(기본 활성)
  8. Server Error Message Reference MySQL
    1213 ER_LOCK_DEADLOCK(데드락), 1205 ER_LOCK_WAIT_TIMEOUT(잠금 대기 한도 초과)
  9. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_database의 deadlocks: 이 DB에서 감지한 데드락 수
  10. PostgreSQL Error Codes (PostgreSQL Documentation) PostgreSQL
    40P01 deadlock_detected

함께 보면 좋은 원인

같은 층: L12 데이터베이스

같은 증상(씹힘·롤백)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기