AUTO_INCREMENT 값의 시퀀스에서 발생할 수있는 간격의 재사용과 관련하여 innodb의 정확한 동작을 이해하려고합니다. 문제는 문서에서 두 모순 된 설명을 발견 한 것 같습니다.잃어버린 AUTO_INCREMENT 값의 재사용
(0, 1, 2) 자동 증가 값을 생성 트랜잭션이 롤백 경우, 그 자동 증가 값이 "손실 ". 자동 증분 열의 값이 생성되면 은 "INSERT-like"문이 완료되었는지 여부와 포함 된 트랜잭션이 인지 여부와 포함 트랜잭션이 롤백되었는지 여부를 확인하기 위해 롤백 할 수 없습니다. 그러한 손실 된 값은 재사용되지 않습니다.
2. http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html
당신은 MySQL 서버를 다시 시작하면, InnoDB하지만 은 (AUTO_INCREMENT 컬럼에 대해 생성하지만 저장되지 않습니다 것을 오래된 값을 다시 사용할 수 있습니다 즉, 다시 압연 된 이전 트렌젝션 동안 만들어진 값).
이렇게 손실 된 값은 다시 사용됩니까? 그들은 참으로 MySQL 서버를 다시 시작한 후에 다시 사용됩니다 경우에, 어떻게 InnoDB하지만 UPDATE위한 t에서 문
SELECT MAX (ai_col)의 등가을 실행하여 새로운 AUTO_INCREMENT 값을 결정한다는 생각이 가능하다
? 서버가 더 이상 자동 증가 값 앞에 을 다시 시작하지 않는 한
네, 이상한 동작은 "InnoDB가 실제로 MAX를 수행하지 않는다는 것"으로 만 설명 할 수 있습니다. 그렇지 않으면 카운터가 절대로 이전 값으로 되돌릴 수 없게됩니다. 하지만 MySql이 카운터를 초기화하는 방법은 무엇입니까? –
@AndreyKon : 시작시 초기화되는 별도의 카운터에 저장됩니다. http://docs.oracle.com/cd/E17952_01/refman-5.6-ko/innodb-auto-increment-traditional.html 자세한 내용은 – gbn
+1입니다. 예 : "서버를 시작한 후 처음 삽입 할 때 InnoDB는 테이블 t에 다음 문을 실행한다. SELECT MAX (ai_col) FROM t FOR UPDATE; " – RandomSeed