Столбец идентичности SQL Server 2005, вставляющий одно и то же значение дважды - PullRequest
0 голосов
/ 17 мая 2010

У меня есть хранимая процедура, которая вставляется в таблицу (где есть столбец идентификаторов, который не является первичным ключом - PK вставляется изначально, используя дату / время для генерации уникального значения).

Затем мы используем SCOPEIDENTITY () для вставки значения, затем есть некоторая логика для генерации значения поля первичного ключа на основе этого значения, которое затем обновляется обратно в таблицу.

В некоторых ситуациях хранимая процедура вызывается одновременно более чем одним процессом, что приводит к ошибкам «Нарушение ограничения PRIMARY KEY ...».

Это может указывать на то, что в столбце идентификаторов допускается вставка одного и того же номера для нескольких записей.

Первый вопрос - как это возможно?

Второй вопрос - как это остановить ... в настоящее время нет обработки ошибок, поэтому я собираюсь добавить логику try / catch - но хотел бы полностью разобраться в проблеме, чтобы решить ее правильно

Ответы [ 3 ]

2 голосов
/ 17 мая 2010

Посмотрите на сообщение об ошибке более внимательно:

Нарушение ПЕРВИЧНЫЙ КЛЮЧ ограничение ...

И учитывая, что вы сказали:

там, где есть столбец идентификаторов, который не является первичным ключом - PK вставляется изначально, используя дату / время для генерации уникального значения

Мне кажется, что проблема не связана со столбцом идентификаторов, так как он не является первичным ключом, но, скорее всего, подход даты / времени не , генерирующий уникальное значение и вызывающий когда вы пытаетесь вставить его.

Есть ли причина, по которой вы не просто используете столбец идентификаторов в качестве первичного ключа?

1 голос
/ 17 мая 2010

Я думаю, вы должны использовать IDENT_CURRENT ('tablename' ') .

SCOPE_IDENTITY () , вернет последнее значение идентификатора, созданное в текущем сеансе.

IDENT_CURRENT не ограничен областью действия и сеансом; он ограничен указанной таблицей.

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

Здесь вы можете прочитать о вашей проблеме

http://web.archive.org/web/20130605142906/http://connect.microsoft.com/SQLServer/feedback/details/328811/

и еще одна полезная статья о параллелизме

https://sqlblog.org/2009/03/21/six-reasons-you-should-be-nervous-about-parallelism

Удачи!

0 голосов
/ 17 мая 2010

PK вставляется изначально с использованием даты / времени для генерации уникального значения

Вы уверены, что это личность вызывает проблемы? Если вы вставите текущее значение даты / времени в качестве начального значения для PK, и оно будет выполняться одновременно двумя различными потоками / процессами в одно и то же время, скорее всего, вы получите одинаковое значение.

...