2010-03-27 5 views
3

주 키 (IsIdentity = Yes)와 고유 키 제약 조건을 구성하는 세 개의 다른 필드가있는 SqlServer 2008 테이블이 있습니다.고유 키 제약 조건 위반시 기본 키 Identity 값 증가

또한 테이블에 레코드를 삽입하는 저장 프로 시저가 있고 SqlConnection 개체를 사용하여 C#을 통해 sproc을 호출합니다.

는 C#의 sproc에 호출

의 sproc 호출이 고유 키 제약 조건을 위반

는, SQLException이가 발생 ....는 C#의 sproc에 호출이 고유 키 제약 조건을 위반했을 경우에 그러나 나는 흥미로운 결과를 발견했습니다, 잘 작동 - 놀랍지도 않고 멋진 것도 아닙니다. 그러나 테이블에 성공적으로 추가 된 다음 레코드가 이전 레코드보다 정확히 하나가 아닌 PK 값을 가지고 있음을 알게되었습니다.

예 : 테이블에 PK 값이 1, 2,3,4 및 5입니다. sproc은 여섯 번째 레코드를 삽입하려고하지만 고유 키 제약 조건을 위반하므로 여섯 번째 레코드가 삽입되지 않습니다. 그런 다음 sproc은 다른 레코드를 삽입하려고 시도하고 이번에는 성공합니다. -이 새 레코드의 PK 값은 6 대신 7입니다.

이 정상적인 동작입니까? 그렇다면 왜 그런지 이유를 설명해 주시겠습니까? (레코드를 삽입하지 못한 경우 PK 인덱스가 증가하는 이유는 무엇입니까?)

이것이 정상적인 동작이 아닌 경우 이러한 증상이 나타나는 이유에 대한 힌트를 제공 할 수 있습니까?

답변

6

예, 정상입니다.

여기에 트랜잭션이 계속 발생하고 이것이 SQL Server에서 실행 된 잠재적 인 작업 순서라고 상상해보십시오.

  1. ID 1, 2, 3, 4, 5가 사용됩니다.
  2. 클라이언트 A가 트랜잭션을 시작합니다.
  3. 클라이언트 A는 삽입을 수행하지만 커밋하지 않습니다 (ID 6).
  4. 클라이언트 B가 트랜잭션을 시작합니다.
  5. 클라이언트 B는 삽입을 수행하지만 커밋하지 않습니다. (ID 7).
  6. 클라이언트 A가 롤백됩니다.
  7. 클라이언트 B가 커밋합니다.

이 동작이 가능할 수 있기 때문에 삽입에 실패하면 ID 6이 건너 뛴다는 것을 알 수 있습니다.

+0

예. 절대 ID 필드를 무시하지 않아도됩니다. – HLGEM