Эффективный способ генерирования последовательных чисел на федерациях SQL Azure

StackOverflow https://stackoverflow.com//questions/9642916

Вопрос

Учитывая, что Federations SQL Azure не поддерживает свойство или последовательности идентификации или последовательности, каким бы эффективным способом генерировать последовательные числа при вставке записей?

Например, с учетом таблицы с этими столбцами:

CREATE TABLE [dbo].[Orders] (
    [TenantId] [uniqueidentifier] NOT NULL,
    [OrderId] [uniqueidentifier] NOT NULL,
    [OrderNumber] [int] NOT NULL
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
        [TenantId] ASC,
        [OrderId] ASC
    )
) FEDERATED ON ([FederationKey] = [TenantId])
.

Для каждого заказа вставлен для данного арендатора, упоминание должно быть увеличено. Например, для Tentant aidentive будет 1, 2, 3 ... А для revant B Cartty B будет также 1, 2, 3 ... в независимой последовательности. В идеале не должно быть пробелов.

Tenantid и ardiD - это компоненты первичного ключа. Их ценности устанавливаются приложением, и они не связаны с проблемой генерации последовательностей; Только упорядочение имеет последовательное число с именем бизнес. Кроме того, Tenantid - это распределительный ключ Федерации.

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

Это будет оптимальный подход с учетом масштабируемости, разрыва, блокировки ресурсов? Любые другие полезные хитрости, учитывая ограничения федераций SQL Azure?

Это было полезно?

Решение

Вот 2 дополнительных идеи.

Подход будет иметь отдельный процесс обновления этого поля, чтобы сделать этот асинхронный, если это что-то возможно для вашего бизнес-сценария. Вам нужно будет иметь поле оформления принять нулевые значения для этого подхода. Чтобы узнать, какой заказ пришел первый, так что он получает правильный порядок, я бы также добавил поле вставления. Обработка Async становится все более сложным, если у вас есть несколько рабочих ролей, выполняющих эту обязанность для резервирования, в этом случае вам нужно будет назначить каждый процесс, присвоен сам записи, на которых он работает (так, что вам также нужно собственное поле), добавьте тест параллелизма во время Обновление для обеспечения каждого процесса выполняется в своих собственных записях, и истекает назначение записей (так, что вам также нужно присваиваемое поле), если процесс вылетает так, чтобы оно не оставляет сирот. Не очень тривиально ...

А потом у вас есть бедный человек ... который когда звезды выравниваются на самом деле достаточно хорошо, могут быть все, что вам нужно. Если вы готовы иметь оптимистичный подход параллелизма, попробуйте использовать следующий номер во время вставки (сначала выберите MAX Shortnumber сначала для данного TenantId и ardiD), затем выполните вставку. Если вставка не удается (поскольку вы добавили уникальный индекс на TenantID, заказа для этой цели), просто добавьте 1 к порядку. Реальная проблема здесь - частота повторных попыток и скорее всего этого подхода. Если у вас есть относительно упрощенный бизнес-процесс, это может фактически никогда не потерпеть неудачу; Однако, если у вас есть заказы, которые постоянно добавляются из нескольких проспектов, это может быть неприемлемый подход.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top