Увеличение значения идентификатора первичного ключа при нарушении ограничения уникального ключа - PullRequest
3 голосов
/ 27 марта 2010

У меня есть таблица SqlServer 2008, которая имеет первичный ключ (IsIdentity = Yes) и три других поля, которые составляют ограничение уникального ключа.

Кроме того, у меня есть процедура сохранения, которая вставляет запись в таблицу, и я вызываю sproc через C #, используя объект SqlConnection.

Вызов C # sproc работает нормально, однако я заметил интересные результаты, когда вызов C # sproc нарушает ограничение уникального ключа ....

Когда вызов sproc нарушает ограничение уникального ключа, создается исключение SqlException - что неудивительно и круто. Тем не менее, я заметил, что следующая запись, которая успешно добавлена ​​в таблицу, имеет значение PK, которое точно не на одну единицу больше, чем предыдущая запись -

Например: скажем, в таблице пять записей, где значения PK равны 1,2,3,4 и 5. Sproc пытается вставить шестую запись, но ограничение уникального ключа нарушено и, таким образом, шестая запись не вставлена. Затем sproc пытается вставить другую запись, и на этот раз она успешна. - Эта новая запись имеет значение PK 7 вместо 6.

Это нормальное поведение? Если да, можете ли вы дать мне причину, почему это так? (Если запись не может быть вставлена, почему индекс PK увеличивается?)

Если это не нормальное поведение, можете ли вы дать мне какие-либо подсказки относительно того, почему я вижу эти симптомы?

1 Ответ

6 голосов
/ 27 марта 2010

Да, это нормально.

Представьте, что здесь происходят транзакции, и это потенциальный порядок операций, выполняемых на SQL Server.

  1. Используются идентификаторы 1, 2, 3, 4, 5.
  2. Клиент A начинает транзакцию.
  3. Клиент A выполняет вставку, но не фиксирует (ID 6).
  4. Клиент B начинает транзакцию.
  5. Клиент B выполняет вставку, но не фиксирует. (ID 7).
  6. Клиент А откатывается.
  7. Клиент B принимает.

Из-за возможности (не обязательно наличия) такого поведения вы видите, что ID 6 пропускается при сбое этой вставки.

...