Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dieses Beispiel unterstützt eine Reihe von Themen über skalierbares Anpassungsdesign. Um am Anfang zu beginnen, siehe Skalierbares Anpassungsdesign im Microsoft Dataverse.
Ein Szenario, das das häufige Missverständnis veranschaulicht, wie Transaktionen innerhalb von Dataverse behandelt werden, ist die Implementierung eines automatischen Nummerierungssystems.
In diesem Szenario dient die Anforderung typischerweise dazu:
- Generieren Sie eine eindeutige Nummer nach einem bestimmten Muster.
- Ermöglichen Sie es vielen gleichzeitigen Anfragen, den zugehörigen Typ von Datensätzen zu erstellen, z. B. Konten, die eine eindeutige Referenz benötigen.
- Ermöglicht die fortlaufende Nummerierung der eindeutigen Nummern.
- Stellen Sie sicher, dass die Nummerngenerierung konsistent, aber skalierbar ist und unter Last nicht ausfällt. Sie muss auch sicherstellen, dass keine doppelten Nummern erzeugt werden können.
- Generieren Sie die Nummer beim Anlegen des entsprechenden Datensatzes.
Der typische Ansatz besteht aus folgenden Variationen:
- Speichern Sie die zuletzt verwendete Nummer in einem Auto-Nummer-Indexdatenspeicher, z. B. eine benutzerdefinierte Entität mit einer Zeile pro Datentyp.
- Rufen Sie die zuletzt verwendete Zahl ab und erhöhen Sie diese Zahl.
- Notieren Sie die neue Nummer gegen den neu erzeugten Datensatz.
- Speichern Sie die neue Nummer wieder als die zuletzt verwendete Nummer im automatischen Nummernverzeichnisspeicher.
Die folgenden Abschnitte beschreiben verschiedene Ansätze, die innerhalb von Dataverse angewendet werden können, und heben die Auswirkungen hervor, indem sie sowohl die Bedeutung als auch den Nutzen des Verständnisses der Art und Weise, wie Transaktionen verwendet werden, verdeutlichen.
Ansatz 1: Aus einer Transaktion heraus
Der einfachste Ansatz besteht darin, zu erkennen, dass jede Nutzung einer häufig benötigten Ressource das Potenzial für eine Blockade mit sich bringen würde. Da dies einen Einfluss auf die Skalierbarkeit hat, können Sie entscheiden, ob Sie bei der Generierung einer automatischen Nummer eine Plattformtransaktion vermeiden möchten. Betrachten wir das Szenario für die automatische Generierung von Nummerierungen außerhalb der Pipelinetransaktion in einem Vorabüberprüfungs-Plugin.
Wenn Sie dies isoliert ausführen, funktioniert es einwandfrei. Es schützt jedoch nicht wirklich vor Gleichzeitigkeitsfehlern. Wie das folgende Diagramm zeigt, erhalten Sie doppelte Zahlen, wenn zwei parallele Anfragen sowohl die neueste Nummer anfordern als auch den Wert erhöhen und aktualisieren. Da keine Sperre gegen die abgerufene Nummer gehalten wird, ist es möglich, dass eine Wettlaufsituation auftritt und beide Threads den gleichen Wert haben.
In vielen Fällen, auch wenn mehrere Anforderungen auftreten können, könnte dies aufgrund des begrenzten Zeitfensters für Überschneidungen gut funktionieren, aber es verlässt sich eher auf Glück als auf gutes Design, um die Doppelung zu verhindern.
Ansatz 2: In einer Plug-In-Transaktion
Wenn Sie die automatische Nummerierung von einem in der Transaktion registrierten Plug-in (txn) vornehmen, funktioniert das sicher ... richtig?
Unter den gleichen Umständen, in denen sich überschneidende Anfragen, die versuchen, gleichzeitig Nummern zu generieren, wäre es möglich, beiden Anfragen eine Lesesperre in der automatischen Nummerierungstabelle zu gewähren. Leider ist dies an dem Punkt, an dem die Anwendung versucht, dies zu einer exklusiven Sperre zu aktualisieren, nicht möglich, da eine andere gemeinsame Lesesperre dies verhindern würde.
Abhängig davon, wie die Abfragen generiert werden, kann das genaue Verhalten variieren, aber es ist nicht ideal, sich auf diese Bedingungen zu verlassen und sich des Ergebnisses nicht sicher zu sein, wo die Einzigartigkeit wesentlich ist. Selbst wenn dies keinen Fehler verursacht, könnte die gemeinsame Lesefähigkeit es ermöglichen, eine doppelte Nummer zu erzeugen, wenn die Isolationsmodi nicht korrekt sind. Wie das folgende Diagramm zeigt, erhalten beide Datensätze den gleichen Autonummernwert von 8.
Ansatz 3: Pre-Lock in einer Plug-In-Transaktion
Das Verständnis der Funktionsweise der Transaktionen führt dazu, dass man einen sicheren Weg finden kann, dies zu tun.
Bei diesem Ansatz wird von Beginn der Transaktion an ein Platzhalter-Update für den automatischen Nummerierungssatz in ein Feld (z. B. UpdateInProgress) durchgeführt, das ausschließlich aus Gründen der Konsistenz verwendet wird. Dies geschieht durch das Schreiben eines Updates, das anzeigt, dass ein Update im Begriff ist, zu starten. Dieser Prozess fordert dann eine exklusive Schreibsperre für diese Zeile in der automatischen Nummerierungstabelle an und blockiert damit andere Prozesse daran, die automatische Nummerierung zu starten.
Dies ermöglicht es Ihnen dann, die aktualisierte Autonummer sicher zu erhöhen und zurückzuschreiben, ohne dass ein anderer Prozess eingreifen kann.
Es hat die Implikation, dass dies nicht nur die Aktualisierungen der automatischen Nummerierung, sondern auch die Anforderungen an die Kontoerstellung serialisiert, da diese beiden Schritte in derselben Plattformtransaktion stattfinden. Wenn die Erstellung von Konten schnelle Aktionen sind, dann kann das ein perfekter Ansatz sein und stellt sicher, dass die Kontoerstellung und die automatische Nummerierung konsistent durchgeführt werden; wenn eines scheitert, scheitern sie beide und es wird ein Rollback ausgeführt.
In der Tat, wenn die anderen Aktionen innerhalb der Transaktion schnell sind, ist dies der konsistenteste und effizienteste Ansatz zur Implementierung der automatischen Nummerierung in Anpassungen.
Wenn Sie jedoch auch andere synchrone Plugins oder Workflows einführen, die jeweils längere Zeit in Anspruch nehmen, kann die Serialisierung zu einer echten Skalierbarkeitsherausforderung werden, da der automatische Nummerierungsprozess nicht nur sich selbst blockiert, sondern auch das Warten auf die Fertigstellung der anderen Aktivitäten blockiert.
Normalerweise wird die Generierung der Autonummer in einem Pre-Event Plug-in durchgeführt. Sie nehmen die Nummer in die Eingabeparameter des Erstellungsschrittes auf und vermeiden eine zweite Aktualisierung in der Nachbearbeitung, um die generierte Autonummer gegen das Konto aufzuzeichnen.
Unter Berücksichtigung der Auswirkungen der Skalierbarkeit wäre eine Alternative, wenn es eine andere komplexe Verarbeitung im Kontoerstellungsprozess gibt, die automatische Nummerngenerierung in einen Post-Erstellungsprozess zu verschieben, der dennoch einen konsistenten Aktualisierungsprozess gewährleistet. Der Vorteil wäre, dass es die Zeit innerhalb der Transaktion verkürzt, dass die automatische Nummernaufzeichnungssperre gehalten wird, da die Sperre erst gegen Ende des Prozesses durchgeführt wird. Wenn die automatische Nummerierungstabelle die am stärksten umstrittene Ressource ist und dieser Ansatz für alle Prozesse, die auf sie zugreifen, gewählt wird, reduziert dies die Anzahl der Streitigkeiten insgesamt.
Der Kompromiss wäre hier die Notwendigkeit, eine zusätzliche Aktualisierung des Kontos durchzuführen und gleichzeitig die Gesamtzeit zu verkürzen, die das Warten auf den Datensatz der automatischen Nummerierung blockiert.
Hinweis
Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)
Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).