Обеспечить уникальную ценность - PullRequest
0 голосов
/ 23 июля 2010

У меня есть таблица с уникальными значениями внутри нее, и после вызова хранимой процедуры я использую следующий код в подзапросе, чтобы получить случайное значение из таблицы:

SELECT TOP 1 UniqueID FROM UniqueValues
WHERE InitiatingID is NULL
ORDER BY NewID() ASC

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

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

Спасибо

Кайл


Редактировать для уточнения:

Я буферизую уникальные значения. Вот что такое WHERE InitiatingID is NULL. Когда значение выбирается из запроса, устанавливается InitiatingID, и поэтому его нельзя использовать до тех пор, пока он не будет освобожден. Проблема состоит в том, что в миллисекундах этого процесса установка InitiatingID кажется, что значение снова берется, что наносит ущерб процессу.

Ответы [ 3 ]

1 голос
/ 23 июля 2010

Случайно означает, что вы получите одно и то же значение дважды случайным образом.

Почему бы не использовать столбцы IDENTITY?

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

0 голосов
/ 23 июля 2010

Как насчет использования update с предложением output для выбора UniqueId и одновременной установки InitiatingId.http://msdn.microsoft.com/en-US/library/ms177564(v=SQL.90).aspx

Что-то вроде: (Хотя у меня нет SQL Server под рукой, поэтому не проверял.)

DECLARE @UniqueIDTable TABLE
(
    UniqueId int
)


UPDATE UniqueValues
SET InitiatingID = @InitiatingID
OUTPUT INSERTED.UniqueId into @UniqueIDTable
WHERE UniqueID = 
    (SELECT TOP 1 UniqueID FROM UniqueValues 
    WHERE InitiatingID is NULL 
    ORDER BY NewID() ASC)
AND InitiatingID is NULL
0 голосов
/ 23 июля 2010

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

Если вы хотите, чтобы никогда не рисовать один и тот же уникальный идентификатор в строке,вы могли бы рассмотреть буферизацию «старого» уникального идентификатора где-нибудь и сбросить ваш розыгрыш, если он совпадает (или запустить WHERE <> currentlydrawuniqueID).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...