Udostępnij za pośrednictwem


Użycie transakcji do aktualizacji modelu

Transakcje zapewniają, że zmiany wprowadzone w magazynie są traktowane jako grupa. Zmiany pogrupowane mogą zostać zatwierdzone lub wycofane jako pojedyncza jednostka.

Za każdym razem, gdy kod programu modyfikuje, dodaje lub usuwa dowolny element w Sklepie w zestawie SDK wizualizacji i modelowania programu Visual Studio, musi to zrobić wewnątrz transakcji. Po zmianie musi istnieć aktywne wystąpienie Transaction skojarzone ze sklepem. Dotyczy to wszystkich elementów modelu, relacji, kształtów, diagramów i ich właściwości.

Mechanizm transakcji pomaga uniknąć niespójnych stanów. Jeśli podczas transakcji wystąpi błąd, wszystkie zmiany zostaną wycofane. Jeśli użytkownik wykonuje polecenie Cofnij, każda ostatnia transakcja jest traktowana jako pojedynczy krok. Użytkownik nie może cofnąć części ostatnich zmian, chyba że jawnie umieścisz je w oddzielnych transakcjach.

Otwieranie transakcji

Najwygodniejszym sposobem zarządzania transakcją jest using instrukcja ujęta w instrukcji try...catch :

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.
}

Jeśli podczas zmian wystąpi wyjątek uniemożliwiający zakończenie Commit() , sklep zostanie zresetowany do poprzedniego stanu. Pomaga to upewnić się, że błędy nie opuszczają modelu w stanie niespójnym.

Możesz wprowadzić dowolną liczbę zmian wewnątrz jednej transakcji. Nowe transakcje można otworzyć wewnątrz aktywnej transakcji. Transakcje zagnieżdżone muszą zostać zatwierdzone lub wycofane przed zakończeniem zawierającej transakcji. Aby uzyskać więcej informacji, zobacz przykład TransactionDepth właściwości .

Aby wprowadzić zmiany na stałe, należy Commit dokonać transakcji przed jej likwidacją. Jeśli wystąpi wyjątek, który nie zostanie przechwycony wewnątrz transakcji, sklep zostanie zresetowany do stanu przed zmianami.

Wycofywanie transakcji

Aby upewnić się, że sklep pozostaje w stanie lub powróci do stanu przed transakcją, możesz użyć jednej z następujących taktyk:

  1. Zgłoś wyjątek, który nie jest przechwycony wewnątrz zakresu transakcji.

  2. Jawne wycofanie transakcji:

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

Transakcje nie wpływają na obiekty niezwiązane z magazynem

Transakcje zarządzają tylko stanem Sklepu. Nie mogą cofnąć częściowych zmian wprowadzonych w elementach zewnętrznych, takich jak pliki, bazy danych lub obiekty zadeklarowane przy użyciu zwykłych typów poza definicją DSL.

Jeśli wyjątek może pozostawić taką zmianę niezgodną ze sklepem, należy radzić sobie z taką możliwością w procedurze obsługi wyjątków. Jednym ze sposobów upewnienia się, że zasoby zewnętrzne pozostają zsynchronizowane z obiektami Magazynu, jest połączenie każdego obiektu zewnętrznego z elementem w magazynie przy użyciu procedur obsługi zdarzeń. Aby uzyskać więcej informacji, zobacz Programy obsługi zdarzeń propagują zmiany poza modelem.

Reguły są uruchamiane na końcu transakcji

Po zakończeniu transakcji, zanim transakcja zostanie usunięta, reguły dołączone do elementów w magazynie zostaną wyzwolone. Każda reguła jest metodą, która jest stosowana do elementu modelu, który uległ zmianie. Na przykład istnieją reguły "naprawy", które aktualizują stan kształtu po zmianie elementu modelu i tworzą kształt podczas tworzenia elementu modelu. Nie ma określonej kolejności wypalania. Zmiana wprowadzona przez regułę może wyzwalać inną regułę.

Możesz zdefiniować własne reguły. Aby uzyskać więcej informacji na temat reguł, zobacz Odpowiadanie na zmiany i propagowanie ich.

Reguły nie są wyzwalane po cofnięciu, powtórzeniu lub wycofaniu polecenia.

Kontekst transakcji

Każda transakcja ma słownik, w którym można przechowywać dowolne informacje:

store.TransactionManager

.CurrentTransaction.TopLevelTransaction

.Context.Add(aKey, aValue);

Jest to szczególnie przydatne w przypadku przesyłania informacji między regułami.

Stan transakcji

W niektórych przypadkach należy uniknąć propagacji zmiany, jeśli zmiana jest spowodowana cofnięciem lub ponownego wykonania transakcji. Może się tak zdarzyć, na przykład, jeśli napiszesz procedurę obsługi wartości właściwości, która może zaktualizować inną wartość w sklepie. Ponieważ operacja cofania resetuje wszystkie wartości w magazynie do ich poprzednich stanów, nie jest konieczne obliczenie zaktualizowanych wartości. Użyj tego kodu:

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

Reguły mogą być wyzwalane, gdy magazyn jest początkowo ładowany z pliku. Aby uniknąć reagowania na te zmiany, użyj:

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