Ambito delle variabili nelle orchestrazioni
Vi sono alcune considerazioni importanti circa la visibilità e lo stato delle variabili e dei parametri di orchestrazione in vari punti dell'orchestrazione, in particolare nei gestori delle eccezioni e nei blocchi di compensazione.
I parametri di orchestrazione sono visibili in tutto il corpo dell'orchestrazione nonché nel relativo blocco di compensazione.
Le variabili a livello di ambito sono visibili nel corpo dell'ambito, nonché in tutti i relativi gestori di eccezioni e nel relativo blocco di compensazione. All'interno dei gestori di eccezioni le variabili sono considerate non inizializzate, poiché non è noto se l'eccezione che ha portato a un dato gestore ha avuto luogo prima o dopo una inizializzazione nel corpo. Per questo motivo, se si dichiara una variabile in un ambito e la si inizializza nel corpo, non è possibile leggere da essa in un gestore di eccezioni senza che venga generato un errore di compilazione. Nel caso delle transazioni a esecuzione prolungata esiste una soluzione. Nel seguente esempio viene illustrato come utilizzare l'operatore succeeded() per garantire un comportamento corretto in fase di esecuzione:
Nota
Il seguente codice è pseudocodice che descrive un processo logico. Questo codice non può essere utilizzato in una forma Espressione dell'orchestrazione.
scope longrunning transaction L { System.Int32 i; System.Int32 v; body { i = 3; scope longrunning transaction T { body { i = 5; } } } exceptions { catch { if(succeeded(T)) { v = i; // OK to read from it here — no compiler errors! } } } }
In un blocco di compensazione, tutte le variabili assumono i valori che avevano al momento del commit del corpo dell'ambito. Si noti che il blocco di compensazione di un ambito non viene mai eseguito immediatamente dopo il completamento del relativo corpo. Vi è sempre codice intermedio. Se un frammento del codice intermedio aggiorna alcune variabili di un ambito esterno e quindi viene eseguito il blocco di compensazione, gli aggiornamenti non saranno presenti nel blocco di compensazione. Per le variabili verranno temporaneamente ripristinati i valori che avevano al momento del commit dell'ambito proprietario della compensazione.
Se una transazione è annidata all'interno di un ciclo, la transazione viene compensata tante volte quante sono le esecuzioni del ciclo. All'interno del blocco di compensazione per ciascuna iterazione, le variabili di un ambito esterno assumono i valori che avevano al momento dell'iterazione della transazione di cui è stato eseguito il commit.
Gli eventuali aggiornamenti apportati alle variabili di un ambito esterno o ai parametri di orchestrazione nei blocchi di compensazione di ambiti interni non saranno visibili dopo il completamento del blocco di compensazione. In altre parole, non è possibile utilizzare il blocco di compensazione per modificare direttamente i valori delle variabili di un ambito esterno.