Postupy: Používání transakcí k aktualizaci modelu
Transakce, ujistěte se, že změny provedené v úložišti jsou považovány za skupinu.Změny, které jsou seskupeny lze potvrzena nebo vrácena zpět jako jeden celek.
Kdykoli programový kód změní, přidá nebo odstraní libovolný prvek v úložišti v Visual Studio vizualizaci a modelování SDK je nutné uvnitř transakce.Musí být aktivní instanci Transaction spojené s úložišti při změně dojde.To platí pro všechny prvky modelu, vztahy, tvary, diagramy a jejich vlastnosti.
Transakce mechanismus umožňuje vyhnout se státy nekonzistentní.Pokud dojde k chybě během transakce, všechny změny vráceny zpět.Pokud uživatel provede příkazu zpět, každý poslední transakce je považován za jednoho kroku.Uživatele nelze vrátit zpět části Nedávné změny, pokud není výslovně vložení do samostatných transakcí.
Otevření transakce
Je nejpohodlnější způsob správy transakce se using prohlášení uzavřený v try...catch prohlášení:
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.
}
Pokud výjimku, která zabraňuje závěrečné Commit() dojde během změny, úložiště bude obnovit do předchozího stavu.To umožňuje zajistit, že chyby nesmějí opustit modelu v nekonzistentním stavu.
Můžete vytvořit libovolný počet změn v rámci jedné transakce.Můžete otevřít nové transakce uvnitř aktivní transakce.Vnořené transakce musí potvrdit nebo vrátit zpět před koncem obsahující transakce.Další informace naleznete v příkladu pro TransactionDepth vlastnost.
Chcete-li změny trvalé, Commit transakcí, než je uvolněn.Pokud dojde k výjimce není zachycené uvnitř transakce, bude úložiště obnovit do stavu před změny.
Vrácení transakce zpět
Chcete-li zajistit, aby úložiště zůstane nebo se vrátí do stavu před transakce, můžete použít buď tyto taktiku:
Vyvolat výjimku, není zachycené uvnitř oboru transakce.
Explicitně vrácení transakce:
this.Store.TransactionManager.CurrentTransaction.Rollback();
Transakce nemají vliv na jiné úložiště objektů
Transakce se řídí pouze stav úložiště.Nelze vrátit zpět provedené na externí položky, například souborů, databází nebo objekty, které mají deklarována pomocí běžných typů mimo definici DSL částečné změny.
Výjimku mohou nechat takovou změnu nekonzistentní s úložištěm, by se měl zabývat možnost zpracování výjimek.Ujistěte se, že externí prostředky zůstanou synchronizovány s objekty úložišti jeden způsob je spojit každý externí objekt v úložišti prvku pomocí obslužné rutiny událostí.Další informace naleznete v tématu Obslužné rutiny události šíří změny mimo model.
Pravidla požáru na konci transakce
Na konci transakce před vyřazení transakce pravidla připojená k prvkům v úložišti při vyvolání.Každé pravidlo je metoda používaná k prvku modelu, který byl změněn.Existují pravidla "Opravit", které aktualizovat stav obrazce při změně jeho prvek modelu a které vytvořit tvar při vytvoření prvku modelu.Neexistuje žádné pálení zadaného pořadí.Změny pravidlo lze požáru jiné pravidlo.
Můžete definovat vlastní pravidla.Další informace o pravidlech naleznete v Reagování na změny a šíření změn.
Pravidla neaktivovat po vrácení zpět, znovu nebo příkaz vrátit zpět.
Kontext transakce
Každá transakce má slovník, ve kterém můžete uložit požadované informace:
store.TransactionManager
.CurrentTransaction.TopLevelTransaction
.Context.Add(aKey, aValue);
To je užitečné pro přenos informací mezi pravidly.
Stav transakce.
V některých případech je nutné se vyhnout rozmnožovací změnu, pokud změna je způsobena vrácení nebo opakování transakce.To může nastat například psát obslužné rutiny hodnotu vlastnosti, můžete aktualizovat jinou hodnotu v úložišti.Protože operace zpět obnoví všechny hodnoty v úložišti do předchozího stavu, není nutné vypočítat aktualizované hodnoty.Použijte tento kód:
if (!this.Store.InUndoRedoOrRollback) {...}
Pravidla lze požáru při úložiště je zpočátku načítán ze souboru.Chcete-li se vyhnout reagovat na tyto změny, použijte:
if (!this.Store.InSerializationTransaction) {...}