если 2 разные базы данных на одной машине работают с NEWID (), гарантируется ли, что никогда не произойдет конфликт? - PullRequest
0 голосов
/ 20 июля 2011

если 2 разные базы данных на одном компьютере работают с NEWID (),

Гарантируется ли, что никогда не будет конфликта?

Ответы [ 6 ]

5 голосов
/ 20 июля 2011

Достаточно уникально, статистически. Мир закончится до того, как вы столкнетесь.

GUID является обязательным в большинстве сценариев репликации, когда многие машины отправляют данные друг другу: вы не можете настроить репликацию без GUID. Так что, конечно, безопасно использовать на многих машинах

2 голосов
/ 20 июля 2011

NEWID() значения генерируются случайным образом. Хотя, по статистике, существует вероятность того, что значения, возвращаемые NEWID(), могут столкнуться, основываясь на всех машинах, генерирующих значения по всему миру, вам нужно беспокоиться о более вероятных событиях, таких как весь ваш сервер самопроизвольно сгорает.


На одном компьютере с Windows существует одна функция Windows, отвечающая за значения, которые становятся доступными с помощью функции NEWID(), и вероятность получения двух одинаковых значений в ряду даже ниже, чем у любых двух случайных компьютеров, которые делают это, поэтому ниже вероятность того, что два вызова в разных базах данных на одном компьютере приведут к одному и тому же значению.

1 голос
/ 14 февраля 2012

Насколько я понимаю (хотя я не могу проверить), что NEWID () использует RPC UUIDCreate для генерации уникального GUID, который получается из MAC-адреса машины, случайного числа и отметки даты и времени. Также UUIDCreate специально разработан, чтобы возвращать уникальный идентификатор для каждого звонка. Я еще не столкнулся с какими-либо проблемами. Поскольку многие функции, включая Active Directory, очень зависят от уникальных идентификаторов GUID, я вполне уверен, что Microsoft гарантирует, что этот метод действительно генерирует уникальные идентификаторы на разных машинах. Единственный риск, о котором я знаю, - это когда две машины имеют одинаковый MAC-адрес. Может быть, кто-то может найти конкретную документацию, которая определяет алгоритм.

1 голос
/ 20 июля 2011

NEWID () - это уникальный идентификатор в SQL Server, представляющий собой 16-байтовый GUID.

См. http://msdn.microsoft.com/en-us/library/ms187942.aspx и http://en.wikipedia.org/wiki/Globally_unique_identifier

0 голосов
/ 20 июля 2011

NEWID() - это недетерминированная функция в SQL Server, которая возвращает уникальное значение типа uniqueidentifier.Документы MSDN прямо заявляют: «возвращает уникальное значение».

Вы можете использовать его следующим образом:

DECLARE @foo uniqueidentifier = NEWID();
SELECT @foo;

Вы также можете использовать его как значение столбца по умолчанию в таблице.

CREATE TABLE [dbo].[TestTable](
    [ID] [uniqueidentifier] NOT NULL  DEFAULT newid(),
)    

Вероятность того, что сервер сгенерирует тот же GUID для баз данных 2+, очень мала.Слишком маленький, чтобы беспокоиться.Чтобы изучить / проверить / подтвердить это, вам нужно проанализировать реализацию NEWID().

0 голосов
/ 20 июля 2011

NEWID будет уникальным для вашей машины, но не обязательно уникальным для всех машин везде.

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