Frage

In Anbetracht dessen, dass SQL Azure Federations nicht die Identitätseigenschaft oder--Sequenzen unterstützt, was wäre ein effizienter Weg, um sequentielle Nummern zu generieren, wenn Sie Datensätze einfügen?

Beispielsweise mit einer Tabelle mit diesen Spalten: generasacodicetagpre.

Für jede für einen bestimmten Mieter eingefügte Reihenfolge sollte der BestelldID inkrementiert werden. Zum Beispiel wäre für das zahnantische Bestellid 1, 2, 3 ... und für den Mieter B-Bestellid wäre auch 1, 2, 3 ... in einer unabhängigen Sequenz. Idealerweise sollte es keine Lücken geben.

tenantid und bestellid sind Komponenten des Primärschlüssels. Ihre Werte werden von der Anwendung festgelegt und sie sind nicht mit dem Problem der Erzeugungssequenzen zusammenhängen. Nur OrderID hat die sequentielle Nummer mit der Business-Bedeutung. Tenantid ist auch der Verteilungsschlüssel des Föderats.

Dieser MSDN-Blog-Artikel beschreibt in Option 1 einen Ansatz, mit dem eine Tabelle mit den Sequenzen hält und mit einer gespeicherten Prozedur in einer getrennten Transaktion verwendet wird, um die Sequenzen zu erhöhen. Jeder Mieter hätte einen Datensatz in dieser Tabelle, die den letzten verwendeten Wert der Sequenz hält.

würde das optimale Ansatz sein, wenn man die Skalierbarkeit, der Beherrschung, der Ressourcenverriegelung berücksichtigt? Andere nützliche Tricks, wenn man die Einschränkungen von SQL Azure Federations in Betracht ziehen?

War es hilfreich?

Lösung

Hier sind 2 weitere Ideen.

Ein Ansatz wäre, um ein separates Prozess zu aktualisieren, das Feld, um dieses Asynchron zu machen, wenn dies für Ihr Business-Szenario etwas möglich ist. Sie müssen das Feld BestellNumber-Feld Null-Werte für diesen Ansatz akzeptieren. Um zu wissen, welche Reihenfolge zuerst kam, damit er die richtige Bestellnummer erhält, würde ich auch ein Inserteddate-Feld hinzufügen. Die Async-Verarbeitung wird komplexer, wenn Sie mehrere Worker-Rollen haben, die diese Pflicht für die Redundanz ausführen, in diesem Fall müssen Sie jeden Prozess selbst die Datensätze anweisen, an denen er arbeitet (sodass auch ein eigenes Feld benötigen Das Update, um sicherzustellen, dass jeder Prozess auf eigenen Datensätzen ausgeführt wird, und verfügen über den Auftragsauftragsaufzeichnungsaufzeichnungen (sodass auch ein Zuweisungsfeld benötigt), wenn der Prozess abstürzt, sodass es Waisenkinder nicht hinterlässt. Nicht wirklich trivial ...

Und dann haben Sie den MAN-Ansatz des Armen ..., in dem sich die Sterne selbst gut genug ausrichten, vielleicht alles, was Sie brauchen. Wenn Sie bereit sind, einen optimistischen Parallelitätsansatz zu haben, versuchen Sie es mit der nächsten Nummer während des Einsatzes (Wählen Sie zuerst die maximale Bestellnummer für ein bestimmtes Tenantid und BestelldID), und führen Sie dann den Einsatz aus. Wenn der Einsatz fehlschlägt (weil Sie einen einzigartigen Index auf TenantID hinzugefügt haben, geben Sie zu diesem Zweck auf Bestellung), einfach 1 zur Bestellnummer hinzufügen. Das eigentliche Problem hier ist die Häufigkeit der Wiederholungen und die Wahrscheinlichkeit dieses Ansatzes, der ausfällt. Wenn Sie einen relativ stromlinienförmigen Geschäftsprozess haben, kann dies tatsächlich versagen. Wenn Sie jedoch keine Bestellungen haben, die ständig aus mehreren Wege hinzugefügt haben, kann dies ein inakzeptabler Ansatz sein.

Andere Tipps

Nicht sicher, wie viel Aufwand erforderlich wäre, um zu Ihrem Szenario zu passen, aber sehen Sie sich dies auch an und sehen Sie, ob Sie es optimieren können: Snowmaker - ein eindeutiger ID-Generator für Azure(oder eine andere Cloud-Hosting-Umgebung)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top