質問

SQL AzureフェデレーションがIDプロパティまたはシーケンスをサポートしていないことを考慮すると、レコードを挿入するときに連続した数を生成する効率的な方法は何でしょうか。

これらの列を含むテーブルを考えると、

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の場合、順序は1,2,3 ...であり、テナントBの場合も1,2,3 ...でも独立したシーケンスである。理想的にはギャップがないはずです。

tenantidとorderIdは主キーのコンポーネントです。それらの値はアプリケーションによって設定され、それらはシーケンスを生成するという問題とは関係ありません。 OrderIDだけがビジネスの意味を持つ順番です。また、Tenantidはフェデレーションの流通鍵です。

>このMSDNブログ記事オプション1では、シーケンスを保持し、シーケティングされたトランザクション内のストアドプロシージャを使用してシーケンスをインクリメントするためのテーブルを持つアプローチを説明します。各テナントは、シーケンスの最後に使用されている値を保持しているこのテーブルのレコードを持ちます。

スケーラビリティ、競合、リソースロックを考慮して最適なアプローチですか? SQL Azure Federationsの制限を考慮して、他の有用なトリックは?

役に立ちましたか?

解決

ここに2つの追加のアイデアがあります。

アプローチは、それがあなたのビジネスシナリオにとって可能なものであるならば、このフィールドを非同期にするために別のプロセスを更新することです。このアプローチのNULL値を承認するには、ordernumberフィールドを受け入れる必要があります。どの順序が最初にやってくるかを知るために、正しい順序を取得するように、挿入型フィールドも追加します。この場合、Async Processingはこの義務を冗長化するために複数のワーカーロールがある場合、各プロセスが機能しているレコードを割り当てる必要があります(そのため、所有のフィールドも必要)、並行性テストを追加する必要があります。各プロセスが独自のレコードで実行されていることを確認するためのアップデートで、プロセスが孤立しないように、プロセスがクラッシュした場合は、レコードの割り当て期限が切れていることを確認します。本当に些細なことではありません...

それからあなたは貧しい人の男がアプローチを持っています...星があなた自身を十分に揃ったときにあなたが必要とするすべてのものかもしれません。楽観的な並行性アプローチをお持ちである場合は、挿入中に次の番号を使用してみてください(特定のTenantIDとOrderIDの場合は最初に最大のOrderNumberを選択してください)、次に挿入を実行します。挿入が失敗した場合(TenantIDに一意のインデックスを追加したため、その目的のためのOrderNumber)、1をordernumberに追加するだけです。ここでの本当の問題は再試行の頻度とこのアプローチの可能性が失敗したことです。あなたが比較的合理化されたビジネスプロセスを持っているならば、これは実際には失敗することはありません。しかし、あなたは複数の道から絶えず命令を追加した場合、これは許容できないアプローチです。

他のヒント

シナリオに合わせてどれほどの努力が必要であるかはわからないが、これを見てください。 SnowMaker - Azure用のユニークIDジェネレータ(またはその他のクラウドホスティング環境)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top