Condividi tramite


Usare le transazioni per aggiornare il modello

Le transazioni assicurano che le modifiche apportate all'archivio vengano considerate come un gruppo. È possibile eseguire il commit o il rollback delle modifiche raggruppate come singola unità.

Ogni volta che il codice del programma modifica, aggiunge o elimina qualsiasi elemento nello Store in Visual Studio Visualization and Modeling SDK, deve farlo all'interno di una transazione. Quando si verifica la modifica, deve essere presente un'istanza attiva di Transaction associata allo Store. Questo vale per tutti gli elementi del modello, le relazioni, le forme, i diagrammi e le relative proprietà.

Il meccanismo di transazione consente di evitare stati incoerenti. Se si verifica un errore durante una transazione, viene eseguito il rollback di tutte le modifiche. Se l'utente esegue un comando Annulla, ogni transazione recente viene considerata come un singolo passaggio. L'utente non può annullare parti di una modifica recente, a meno che non vengano inserite in modo esplicito in transazioni separate.

Apertura di una transazione

Il metodo più pratico per gestire una transazione è costituito da un'istruzione using racchiusa in un'istruzione 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.
}

Se si verifica un'eccezione che impedisce la finale Commit() durante le modifiche, lo Store verrà reimpostato sullo stato precedente. Ciò consente di assicurarsi che gli errori non lascino il modello in uno stato incoerente.

È possibile apportare un numero qualsiasi di modifiche all'interno di una transazione. È possibile aprire nuove transazioni all'interno di una transazione attiva. Le transazioni nidificate devono eseguire il commit o il rollback prima del termine della transazione contenitore. Per altre informazioni, vedere l'esempio per la TransactionDepth proprietà .

Per rendere permanenti le modifiche, è necessario Commit che la transazione venga eliminata. Se si verifica un'eccezione che non viene intercettata all'interno della transazione, lo Store verrà reimpostato sullo stato prima delle modifiche.

Rollback di una transazione

Per assicurarsi che l'archivio rimanga in o ripristina lo stato prima della transazione, è possibile usare una di queste tattiche:

  1. Generare un'eccezione che non viene intercettata nell'ambito della transazione.

  2. Eseguire il rollback esplicito della transazione:

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

Le transazioni non influiscono sugli oggetti non di archiviazione

Le transazioni regolano solo lo stato dello Store. Non possono annullare modifiche parziali apportate a elementi esterni, ad esempio file, database o oggetti dichiarati con tipi ordinari all'esterno della definizione DSL.

Se un'eccezione potrebbe lasciare tale modifica incoerente con lo Store, è consigliabile gestire tale possibilità nel gestore eccezioni. Un modo per assicurarsi che le risorse esterne rimangano sincronizzate con gli oggetti Store consiste nell'associare ogni oggetto esterno a un elemento in-store usando gestori eventi. Per altre informazioni, vedere Gestori eventi propagare le modifiche all'esterno del modello.

Regole attivate alla fine di una transazione

Alla fine di una transazione, prima dell'eliminazione della transazione, vengono attivate le regole associate agli elementi nell'archivio. Ogni regola è un metodo applicato a un elemento del modello modificato. Ad esempio, sono presenti regole di correzione che aggiornano lo stato di una forma quando il relativo elemento del modello è stato modificato e che creano una forma quando viene creato un elemento del modello. Non esiste alcun ordine di attivazione specificato. Una modifica apportata da una regola può generare un'altra regola.

È possibile definire regole personalizzate. Per altre informazioni sulle regole, vedere Risposta e propagazione delle modifiche.

Le regole non vengono attivate dopo un annullamento, un rollback o un comando di rollback.

Contesto delle transazioni

Ogni transazione ha un dizionario in cui è possibile archiviare tutte le informazioni desiderate:

store.TransactionManager

.CurrentTransaction.TopLevelTransaction

.Context.Add(aKey, aValue);

Ciò è particolarmente utile per il trasferimento di informazioni tra le regole.

Stato della transazione

In alcuni casi è necessario evitare di propagare una modifica se la modifica è causata dall'annullamento o dal rollforward di una transazione. Ciò può verificarsi, ad esempio, se si scrive un gestore di valori di proprietà in grado di aggiornare un altro valore nello Store. Poiché l'operazione di annullamento reimposta tutti i valori nello Store sui relativi stati precedenti, non è necessario calcolare i valori aggiornati. Usare questo codice:

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

Le regole possono essere attivate quando l'archivio viene inizialmente caricato da un file. Per evitare di rispondere a queste modifiche, usare:

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