Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Transakce zajišťují, že se změny provedené v úložišti považují za skupinu. Změny seskupené můžou být potvrzeny nebo vráceny zpět jako jedna jednotka.
Pokaždé, když kód programu upraví, přidá nebo odstraní jakýkoli prvek v úložišti ve Visual Studio Visualization and Modeling SDK, musí to udělat uvnitř transakce. Pokud dojde ke změně, musí existovat aktivní instance Transaction přidružená ke Storu. To platí pro všechny prvky modelu, relace, obrazce, diagramy a jejich vlastnosti.
Mechanismus transakce vám pomůže vyhnout se nekonzistentním stavům. Pokud dojde k chybě během transakce, všechny změny se vrátí zpět. Pokud uživatel provede příkaz Zpět, každá nedávná transakce se považuje za jediný krok. Uživatel nemůže vrátit zpět části nedávné změny, pokud je explicitně neuložíte do samostatných transakcí.
Otevření transakce
Nejpohodlnější způsob správy transakce je s příkazem using, který je uzavřen v příkazu 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.
}
Pokud během změn dojde k výjimce, která brání dokončení Commit(), Store se vrátí do předchozího stavu. To vám pomůže ujistit se, že chyby neopustily model v nekonzistentním stavu.
V rámci jedné transakce můžete provést libovolný počet změn. Nové transakce můžete otevřít uvnitř aktivní transakce. Vnořené transakce musí být potvrzeny nebo vráceny zpět před tím, než obsahující transakce skončí. Další informace, najdete v příkladu vlastnosti TransactionDepth.
Chcete-li provést změny trvale, měli byste před zrušením Commit transakci. Pokud dojde k výjimce, která není zachycena uvnitř transakce, Store se resetuje do stavu před změnami.
Vrácení transakce zpět
Abyste měli jistotu, že Store zůstane v jeho stavu nebo se vrátí k jeho stavu před transakcí, můžete použít některou z těchto taktik:
Vyvolat výjimku, která není zachycena uvnitř rozsahu transakce.
Explicitní vrácení transakce zpět:
this.Store.TransactionManager.CurrentTransaction.Rollback();
Transakce nemají vliv na objekty mimo úložiště
Transakce pouze řídí stav úložiště. Nemohou vrátit zpět částečné změny provedené u externích položek, jako jsou soubory, databáze nebo objekty, které jste deklarovali s běžnými typy mimo definici DSL.
Pokud by výjimka mohla takovou změnu ponechat nekonzistentní se Storem, měli byste se s touto možností vypořádat v obslužné rutině výjimky. Jedním ze způsobů, jak zajistit, aby externí prostředky zůstaly synchronizované s objekty Store, je spojit každý externí objekt s elementem v úložišti pomocí obslužných rutin událostí. Další informace naleznete v tématu Obslužné rutiny událostí šíří změny mimo model.
Pravidla se aktivuje na konci transakce.
Na konci transakce se před jejím uvolněním aktivují pravidla připojená k prvkům ve skladu. Každé pravidlo je metoda použitá na prvek modelu, který se změnil. Existují například "opravná" pravidla, která aktualizují stav obrazce, když se změní jeho prvek modelu, a která vytvoří obrazec při vytvoření prvku modelu. Není zadáno žádné pořadí zapalování. Změna provedená pravidlem může aktivovat jiné pravidlo.
Můžete definovat vlastní pravidla. Další informace o pravidlech naleznete v tématu Reakce na a šíření změn.
Pravidla se neaktivují po vrácení zpět, opakování nebo zrušení změn.
Kontext transakce
Každá transakce má slovník, ve kterém můžete ukládat libovolné informace:
store.TransactionManager
.CurrentTransaction.TopLevelTransaction
.Context.Add(aKey, aValue);
To je užitečné zejména pro přenos informací mezi pravidly.
Stav transakce
V některých případech se musíte vyhnout šíření změny, pokud je změna způsobená vrácením nebo opětovným vrácením transakce zpět. K tomu může dojít například v případě, že napíšete obslužnou rutinu hodnoty vlastnosti, která může aktualizovat jinou hodnotu ve Store. Vzhledem k tomu, že operace vrácení zpět obnoví všechny hodnoty ve Storu na předchozí stavy, není nutné vypočítat aktualizované hodnoty. Použijte tento kód:
if (!this.Store.InUndoRedoOrRollback) {...}
Pravidla se mohou aktivovat, když se úložiště poprvé načítá ze souboru. Pokud se chcete vyhnout reakci na tyto změny, použijte:
if (!this.Store.InSerializationTransaction) {...}