Jak: transakcji można użyć do aktualizacji modelu
Transakcje, upewnij się, że zmiany wprowadzone w magazynie są traktowane jako grupa.Zmiany, które są zgrupowane może być przekazana lub wycofana jako pojedyncza jednostka.
Gdy kod program modyfikuje, dodaje lub usuwa dowolnego elementu w magazynie w Visual Studio wizualizacji i modelowania SDK, musi on zrobić wewnątrz transakcji.Musi być wystąpieniem active Transaction skojarzonego z magazynu, gdy zmiana sytuacji.Dotyczy to wszystkich elementów modelu, relacje, kształty, diagramy i ich właściwości.
Mechanizm transakcji pomaga uniknąć Państwa niespójne.Jeżeli błąd wystąpi podczas transakcji, wszystkie zmiany są przywracane.Jeśli użytkownik wykonuje polecenia Cofnij, każdy ostatniej transakcji jest traktowana jako pojedynczy krok.Użytkownik nie można cofnąć części ostatnich zmian, chyba że wyraźnie umieścić je w oddzielnych transakcji.
Otwieranie transakcji
Najbardziej wygodną metodę zarządzania transakcji jest z using instrukcji ujęte w try...catch instrukcji:
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 wyjątek, który zapobiega końcowym Commit() występuje podczas zmiany, magazynu zostaną zresetowane do poprzedniego stanu.Pomaga to upewnić się, że błędy nie opuszczą modelu w niespójnym stanie.
Można utworzyć dowolną liczbę zmian w obrębie jednej transakcji.Można otworzyć nowe transakcje wewnątrz aktywnej transakcji.Transakcji zagnieżdżonych musi przekazać lub wycofać przed zakończeniem transakcji zawierające.Aby uzyskać więcej informacji, zobacz przykład dla TransactionDepth właściwości.
Aby wprowadzone zmiany były trwałe, należy Commit transakcji, zanim go jest usuwany.Jeśli wystąpi wyjątek nie wychwycona wewnątrz transakcji magazynu zostaną zresetowane do stanu przed zmianami.
Wycofywanie transakcji
W celu zapewnienia, że magazyn pozostaje w lub powraca do stanu przed transakcją, można użyć jednej z tych możliwości:
Podnoszenie wyjątek, który nie jest złowionych wewnątrz zakresu transakcji.
Jawnie wycofywanie transakcji:
this.Store.TransactionManager.CurrentTransaction.Rollback();
Transakcje nie wpływają na obiekty-Store
Transakcje regulować tylko stan magazynu.Nie można ich cofnąć częściowych zmian, wprowadzonych do zewnętrznych elementów, takich jak pliki, bazy danych lub obiektów, które zostały zadeklarowane ze zwykłych typów poza definicją DSL.
Wyjątek może pozostawić takiej zmiany niezgodne z magazynu, powinno dotyczyć tego możliwość obsługi wyjątków.Jednym ze sposobów upewnij się, że zasoby zewnętrzne pozostają zsynchronizowane z obiektami magazynu jest sprzęgnięcie każdego zewnętrznego obiektu do elementu w magazynie za pomocą programów obsługi zdarzeń.Aby uzyskać więcej informacji, zobacz Programy obsługi zdarzeń propagowanie zmian poza modelu.
Zasady ognia na koniec transakcji
Na końcu transakcji zanim transakcja jest usuwany, wywoływane są reguł dołączonych do elementów w magazynie.Każda reguła jest metoda, która jest stosowana do elementu modelu, który uległ zmianie.Na przykład istnieją reguły "Napraw", które aktualizują stan kształtu po zmianie jego elementu modelu i który Tworzenie kształtu po utworzeniu elementu modelu.Istnieje nie wypalania określonej kolejności.Zmiany wprowadzone przez regułę może wystrzelić inna reguła.
Można zdefiniować własne reguły.Aby uzyskać więcej informacji na temat reguł, zobacz Reagowanie na i propagowanie zmian.
Nie uruchamiaj zasady po poleceniu Cofnij, ponów lub polecenia rollback.
Kontekst transakcji
Każda transakcja ma słownik, w którym można przechowywać wszelkie informacje, które mają:
store.TransactionManager
.CurrentTransaction.TopLevelTransaction
.Context.Add(aKey, aValue);
Jest to szczególnie użyteczne w przypadku przekazywania informacji między regułami.
Stan transakcji
W niektórych przypadkach zachodzi potrzeba uniknięcia materiału rozmnożeniowego zmiany, jeśli zmiana jest spowodowana przez cofanie lub ponawianie transakcji.Może to się zdarzyć na przykład, jeśli piszesz obsługi wartości właściwości, które można aktualizować innej wartości w magazynie.Ponieważ operacji cofania resetuje wszystkie wartości w magazynie wracają do poprzedniego stanu, nie jest konieczne do wyliczenia wartości zaktualizowane.Użyj tego kodu:
if (!this.Store.InUndoRedoOrRollback) {...}
Reguły można ognia, gdy magazyn początkowo jest ładowany z pliku.Aby uniknąć, odpowiadania na te zmiany, należy użyć:
if (!this.Store.InSerializationTransaction) {...}