자동 증분 카운터는 디스크가 아닌 주 메모리에만 저장됩니다.
http://dev.mysql.com/doc/refman/4.1/en/innodb-auto-increment-handling.html
이로 인해 서비스 (또는 서버)가 다시 시작되면 다음이 발생합니다.
서버 시작 후, 테이블 t에 첫 번째 삽입을 위해 InnoDB는 다음 명령문과 동등한 명령을 실행합니다. SELECT MAX (ai_col) FROM t FOR UPDATE;
InnoDB는 명령문에 의해 검색된 값을 1 씩 증가시키고이를 컬럼 및 테이블의 자동 증가 카운터에 지정합니다. 테이블이 비어 있으면 InnoDB는 값 1을 사용합니다.
따라서 일반 영어로 MySQL 서비스가 시작된 후에는 테이블의 자동 증가 값이 무엇인지 모릅니다. 따라서 처음 행을 삽입하면 자동 증가를 사용하는 필드의 최대 값을 찾고이 값에 1을 더한 다음 결과 값을 사용합니다. 행이 없으면 1에서 시작합니다.
사용자가 타사 결제 사이트로 리디렉션되는 다중 스레드 환경에서 테이블과 mysql의 자동 증가 기능을 사용하여 ID를 깔끔하게 관리 할 때 문제가되었습니다. 따라서 우리는 제 3자가 가져오고 우리에게 보낸 ID가 고유하고 그런 식으로 유지되도록해야했습니다 (물론 사용자가 리디렉션 된 후 거래를 취소 할 가능성이 있습니다).
따라서 행을 생성하고 생성 된 자동 증분 값을 가져 와서 테이블을 깨끗하게 유지하기 위해 행을 삭제하고 값을 지불 사이트로 전달했습니다. InnoDB가 AI 값을 처리하는 방식의 문제를 해결하기 위해 끝낸 것은 다음과 같습니다.
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
이렇게하면 테이블을 불필요하게 폭파하지 않고 항상 테이블에 행으로 생성 된 최신 transactionId를 유지합니다.
희망이있는 다른 사람에게 도움이되기를 바랍니다.
편집 (2018-04-18) :
아래에 언급 된 Finesse는 MySQL 8.0 이상 에서이 동작이 수정 된 것으로 보입니다.
https://dev.mysql.com/worklog/task/?id=6204
해당 작업 로그의 문구에는 문제가 없지만 최신 버전의 InnoDB는 이제 재부팅시 지속적인 autoinc 값을 지원합니다.
-그레미오