데드락 감지를 켜 두고 데드락 기록을 수집해 공유, 감지를 끈 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)