Pergunta

Considerando que o SQL Azure Federations não suporta a propriedade de IDENTIDADE ou Sequências, o que seria uma forma eficaz de gerar números sequenciais ao inserir registros?

Por exemplo, dada uma tabela com as seguintes colunas:

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])

para cada ordem inserido para um determinado inquilino, o OrderId deve ser incrementado.Por exemplo, para tentant Um Códigodopedido seria 1, 2, 3...e para o inquilino B Códigodopedido também seria 1, 2, 3...independente de sequência.Idealmente, não deve haver espaços.

TenantId e Códigodopedido são componentes da chave primária.Seus valores são definidos pela aplicação e que não está relacionada com a questão da geração de sequências;só Códigodopedido tem o número sequencial com de negócios significado.Também, TenantId é a chave de distribuição da federação.

Este Blog MSDN artigo descreve na opção 1, uma abordagem de ter uma tabela com as seqüências e usando um procedimento armazenado em um segregadas de transação para incrementar as sequências.Cada inquilino teria um registro nesta tabela segurando o último valor da seqüência.

Seria a abordagem ideal, considerando a escalabilidade, a contenção de bloqueio de recurso?Quaisquer outros truques úteis, considerando-se as limitações do SQL Azure Federations?

Foi útil?

Solução

Aqui estão 2 ideias adicionais.

Uma abordagem seria uma parte do processo de atualização de campo para fazer este assíncrona, se é que isso é algo possível para o cenário de negócios.Você precisa ter o OrderNumber campo aceita valores NULOS para esta abordagem.Para saber a Ordem que veio primeiro, de modo que fica o correto OrderNumber, também gostaria de adicionar uma InsertedDate campo.Assíncrono de processamento torna-se mais complexo se você tiver várias funções de operador de executar esse serviço para a redundância, caso em que você precisará ter cada processo de atribuir a si próprio os registos que está a trabalhar (para que você também precisa de um OwnedBy campo), adicionar um teste de simultaneidade durante a ATUALIZAÇÃO para garantir que cada processo está em execução em seus próprios documentos, e ter os registros de atribuição de expirar (para que você também precisa de um AssignedOn campo) se o processo falhar de modo a não deixar órfãos.Realmente não trivial...

E, em seguida, você tem o pobre do homem abordagem...que quando as estrelas se alinham bem apenas o suficiente pode ser tudo o que você precisa.Se você estiver disposto a ter uma simultaneidade otimista abordagem, tente usar o próximo Número durante a inserir (select MAX OrderNumber primeiro para um determinado TenantId e OrderId) e, em seguida, executar a Inserção.Se a inserção falha (porque você adicionou um índice Exclusivo na TenantId, OrderNumber para essa finalidade), basta adicionar 1 para o OrderNumber.A verdadeira questão aqui é a frequência de tentativas e a probabilidade de esta abordagem falha.Se você tem um relativamente simplificado de processo de negócio, este pode, na verdade nunca falha;no entanto, se você tiver pedidos adicionados constantemente a partir de várias avenidas, esta pode ser uma forma inaceitável de abordagem.

Outras dicas

não sei quanto esforço seria necessário para caber seu cenário, mas ter um olhar para esta bem e veja se você pode ajustá-lo: SnowMaker – um exclusivo gerador de id para o Azure (ou qualquer outra nuvem ambiente de hospedagem)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top