2013-12-08 5 views
1

MySQL의 정수 열을 기반으로 ID를 자동으로 생성하는 전략이있는 엔티티가 있습니다. 모든 것이 작동하지만 예외와 관련 롤백을 테스트하는 동안 MySQL은 마지막으로 증가 된 값을 재설정하지 않는다는 것을 알게되었습니다.자동 증가 ID를 제어하는 ​​방법은 무엇입니까?

그래서 성공적인 저장이 엔티티 ID 1을 생성합니다. 저장 시도가 엔티티 ID 2를 가져 오지만 롤백됩니다. 그러면 새 엔티티를 성공적으로 저장하면 엔티티 ID가 3이됩니다.

결과적으로 테이블에는 두 개의 레코드가 있습니다. id 1과 id 3를 가진 하나.

이것을 제어 할 수있는 방법이 있습니까? 기본적으로, 방금 설명한 시나리오에서 id를 1로 설정하고 id를 2로 설정하는 두 개의 엔티티를보고 싶습니다.

+0

다음을 읽어보십시오. http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html –

+0

일반적으로 원하는 것을 원하지 않습니다. 롤백 된 엔티티에 대한 중요한 정보 (복잡한 트랜잭션의 일부)를 로깅하려고한다고 가정하십시오. 고유 한 로그 항목이 있다는 사실은 나중에 중요 할 수 있습니다. –

답변

1

자동 증가 숫자는 고유해야하지만 연속적 일 필요는 없습니다. 그것들은 구현의 우연으로 만 단조롭게 증가하고 있습니다.

항상 특정 값을 삽입하고 자동 증가 메커니즘을 무시할 수 있습니다. 그러나 당신은 어떤 가치가 "다음"가치인지를 알아야 할 것입니다. 경합 조건을 피하려면 테이블을 잠그고 MAX (id) +1을 쿼리 한 다음 해당 값을 삽입해야합니다.

MySQL이 자동으로 수행해야하는 작업과 정확히 같습니다.

자동 증가 작업 방식은 이제 경쟁 조건없이 최대한의 동시성을 허용합니다. 따라서 INSERT를 롤백 할 때 또는 때때로 값을 삭제하는 경우 때때로 값이 "손실"되는 경우가 있습니다.

2

아니요, 변경할 수 없습니다. 그것이 그것이 있어야하는 방법입니다.

자동 증가 ID는 고유해야합니다. 그게 다야.

-1

자신의 자동 증가 논리를 사용하여 처리 할 수 ​​있습니다. 최대 +1 ID 생성기가 있거나 해당 테이블의 PK 자동 생성 ID를 유지 관리하는 테이블이 있어야합니다. 이

LastKey TABLENAME 1 TABLEX 5 TABLEY

매번 같은 테이블, 당신은 증가 된 ID를 얻기 위해이 테이블에서 조회해야합니다.

+0

아이디어를 제공해 주셔서 감사합니다.하지만이 방법은 단일 연결에서만 작동 할 것이라고 생각합니다. 다음 ID를 요구하는 두 개의 동시 트랜잭션이 발생하자마자 문제가 발생합니다. – jacekn

관련 문제