Freigeben über


Verwenden von Transaktionen zum Aktualisieren des Modells

Transaktionen stellen sicher, dass Änderungen, die im Speicher vorgenommen wurden, als Gruppe behandelt werden. Gruppierte Änderungen können als einzelne Einheit übernommen oder zurückgesetzt werden.

Wenn Ihr Programmcode jedes Element im Store in Visual Studio Visualization and Modeling SDK ändert, hinzufügt oder löscht, muss er dies innerhalb einer Transaktion tun. Es muss eine aktive Instanz vorhanden sein, die mit dem Store verknüpft ist, wenn die Änderung erfolgt. Dies gilt für alle Modellelemente, Beziehungen, Formen, Diagramme und deren Eigenschaften.

Der Transaktionsmechanismus hilft Ihnen, inkonsistente Zustände zu vermeiden. Wenn während einer Transaktion ein Fehler auftritt, werden alle Änderungen zurückgesetzt. Wenn der Benutzer einen Rückgängig-Befehl ausführt, wird jede letzte Transaktion als einzelner Schritt behandelt. Der Benutzer kann keine Teile einer kürzlich vorgenommenen Änderung rückgängigmachen, es sei denn, Sie legen sie explizit in separate Transaktionen ein.

Öffnen einer Transaktion

Die bequemste Methode zum Verwalten einer Transaktion ist eine using anweisung, die in eine try...catch Anweisung eingeschlossen ist:

Store store; ...
try
{
  using (Transaction transaction =
    store.TransactionManager.BeginTransaction("update model"))
    // Outermost transaction must always have a name.
  {
    // Make several changes in Store:
    Person p = new Person(store);
    p.FamilyTreeModel = familyTree;
    p.Name = "Edward VI";
    // end of changes to Store

    transaction.Commit(); // Don't forget this!
  } // transaction disposed here
}
catch (Exception ex)
{
  // If an exception occurs, the Store will be
  // rolled back to its previous state.
}

Wenn eine Ausnahme, die das Endgültige Commit() verhindert, während der Änderungen auftritt, wird der Store auf den vorherigen Zustand zurückgesetzt. Dadurch können Sie sicherstellen, dass Fehler das Modell nicht in einem inkonsistenten Zustand belassen.

Sie können eine beliebige Anzahl von Änderungen innerhalb einer Transaktion vornehmen. Sie können neue Transaktionen innerhalb einer aktiven Transaktion öffnen. Die geschachtelten Transaktionen müssen ein Commit ausführen oder einen Rollback durchführen, bevor die enthaltende Transaktion endet. Weitere Informationen finden Sie im Beispiel für die TransactionDepth Eigenschaft.

Wenn Sie Ihre Änderungen dauerhaft vornehmen möchten, sollten Commit Sie die Transaktion vor dem Löschen vornehmen. Wenn eine Ausnahme auftritt, die nicht innerhalb der Transaktion abgefangen wird, wird der Store auf seinen Zustand vor den Änderungen zurückgesetzt.

Ausführen eines Rollbacks für eine Transaktion

Um sicherzustellen, dass der Store vor der Transaktion in seinem Zustand verbleibt oder wiederhergestellt wird, können Sie eine der folgenden Taktiken verwenden:

  1. Werfen Sie eine Ausnahme, die nicht innerhalb des Bereichs der Transaktion abgefangen wird.

  2. Explizites Zurücksetzen der Transaktion:

    this.Store.TransactionManager.CurrentTransaction.Rollback();
    

Transaktionen wirken sich nicht auf Nichtspeicherobjekte aus

Transaktionen regeln nur den Status des Stores. Sie können teilweise Änderungen, die an externen Elementen wie Dateien, Datenbanken oder Objekten vorgenommen wurden, die Sie mit normalen Typen außerhalb der DSL-Definition deklariert haben, nicht rückgängig machen.

Wenn eine Ausnahme eine solche Änderung möglicherweise inkonsistent mit dem Store belassen kann, sollten Sie diese Möglichkeit im Ausnahmehandler behandeln. Eine Möglichkeit, sicherzustellen, dass externe Ressourcen mit den Store-Objekten synchronisiert bleiben, besteht darin, jedes externe Objekt mithilfe von Ereignishandlern mit einem In-Store-Element zu koppeln. Weitere Informationen finden Sie unter Ereignishandler, die Änderungen außerhalb des Modells weitergeben.

Regeln werden am Ende einer Transaktion ausgelöst

Bevor die Transaktion verworfen wird, werden am Ende die Regeln ausgelöst, die mit Elementen im Speicher verbunden sind. Jede Regel ist eine Methode, die auf ein Geändertes Modellelement angewendet wird. Es gibt z. B. "fix up"-Regeln, mit denen der Status eines Shapes aktualisiert wird, wenn sich das Modellelement geändert hat, und ein Shape erstellt wird, wenn ein Modellelement erstellt wird. Es gibt keine angegebene Schießreihenfolge. Eine von einer Regel vorgenommene Modifikation kann eine andere Regel auslösen.

Sie können eigene Regeln definieren. Weitere Informationen zu Regeln finden Sie unter Reagieren auf und Weitergeben von Änderungen.

Regeln werden nach einem Rückgängigmachen, einem Wiederholen oder einem Rollbackbefehl nicht ausgelöst.

Transaktionskontext

Jede Transaktion verfügt über ein Wörterbuch, in dem Sie alle gewünschten Informationen speichern können:

store.TransactionManager

.CurrentTransaction.TopLevelTransaction

.Context.Add(aKey, aValue);

Dies ist besonders hilfreich beim Übertragen von Informationen zwischen Regeln.

Transaktionsstatus

In einigen Fällen müssen Sie die Weitergabe einer Änderung vermeiden, wenn die Änderung durch das Rückgängigmachen oder Wiederholen einer Transaktion verursacht wird. Dies kann beispielsweise passieren, wenn Sie einen Eigenschaftswerthandler schreiben, der einen anderen Wert im Store aktualisieren kann. Da der Rückgängig-Vorgang alle Werte im Store auf ihre vorherigen Zustände zurücksetzt, ist es nicht erforderlich, aktualisierte Werte zu berechnen. Verwenden Sie diesen Code:

if (!this.Store.InUndoRedoOrRollback) {...}

Regeln können ausgelöst werden, wenn der Speicher anfänglich aus einer Datei geladen wird. Um die Reaktion auf diese Änderungen zu vermeiden, verwenden Sie Folgendes:

if (!this.Store.InSerializationTransaction) {...}