Interoperabilità con transazioni COM+ ed Enterprise Services
[Questo argomento è una versione preliminare della documentazione e può essere soggetto a modifiche nelle versioni future. Sono presenti anche argomenti vuoti, utilizzati come segnaposto].
Lo spazio dei nomi System.Transactions supporta l'interoperabilità fra gli oggetti di transazione creati mediante questo spazio dei nomi e le transazioni create tramite COM+.
L'enumerazione EnterpriseServicesInteropOption consente di specificare il livello di interoperabilità con COM+ quando si crea una nuova istanza della classe TransactionScope.
Per impostazione predefinita, quando il codice dell'applicazione verifica la proprietà statica Current, lo spazio dei nomi System.Transactions tenta di individuare una transazione non corrente, oppure un oggetto TransactionScope in cui la proprietà Current sia null. Se tale ricerca ha esito negativo, lo spazio dei nomi System.Transactions tenta di individuare una transazione nel contesto COM+. Si noti che anche se lo spazio dei nomi System.Transactions rileva una transazione nel contesto COM+, predilige comunque le transazioni native dello spazio dei nomi System.Transactions.
Livelli di interoperabilità
L'enumerazione EnterpriseServicesInteropOption definisce i livelli di interoperabilità seguenti: None, Full e Automatic.
La classe TransactionScope contiene costruttori che accettano come parametro l'enumerazione EnterpriseServicesInteropOption.
L'opzione None consente di non impostare alcuna interoperabilità fra i contesti System.EnterpriseServices e gli ambiti di transazione. Dopo aver creato un oggetto TransactionScope con l'opzione None, le modifiche apportate alla proprietà Current non vengono riflesse nel contesto COM+. Analogamente, le modifiche apportate alla transazione nel contesto COM+ non vengono riflesse sulla proprietà Current. Questa opzione rappresenta la modalità più veloce di funzionamento dello spazio dei nomi System.Transactions, in quanto non è richiesta alcuna sincronizzazione aggiuntiva. L'opzione None è il valore predefinito utilizzato dagli oggetti TransactionScope in tutti i costruttori che non accettano l'enumerazione EnterpriseServicesInteropOption come parametro.
Se si desidera combinare le transazioni dello spazio dei nomi System.EnterpriseServices con la transazione di ambiente, è necessario utilizzare l'opzione Full o l'opzione Automatic. Entrambi questi valori si basano sulla funzionalità Services without Components, e pertanto devono essere utilizzati in Windows XP Service Pack 2 o Windows Server 2003.
L'opzione Full impone che la transazione di ambiente dello spazio dei nomi System.Transactions corrisponda sempre a quella dello spazio dei nomi System.EnterpriseServices. Ciò comporta la creazione di un nuovo contesto transazionale System.EnterpriseServices e l'impostazione della transazione corrente dell'ambito TransactionScope come transazione corrente di tale contesto. Ne consegue che la transazione associata alla proprietà Current è completamente sincronizzata con la transazione associata alla proprietà Transaction. Poiché può essere necessario creare nuovi contesti COM+, questo valore comporta una riduzione delle prestazioni.
L'opzione Automatic specifica i requisiti seguenti:
Quando si verifica la proprietà Current, lo spazio dei nomi System.Transactions deve supportare le transazioni nel contesto COM+ se rileva di essere in esecuzione in un contesto diverso da quello predefinito. Si noti che il contesto predefinito non può contenere alcuna transazione. In tal caso, pertanto, anche se è stata scelta l'opzione Automatic, il sistema restituisce come Current la transazione memorizzata nell'archivio locale di thread utilizzato dallo spazio dei nomi System.Transactions.
Se si crea un nuovo oggetto TransactionScope e tale creazione si verifica in un contesto diverso da quello predefinito, la transazione corrente dell'oggetto TransactionScope deve essere riflessa in COM+. In questo caso, il funzionamento dell'opzione Automatic è analogo a quello dell'opzione Full, nel senso che viene creato un nuovo contesto COM+.
Inoltre, quando si imposta la proprietà Current, sia nella modalità Full sia nella modalità Automatic, l'impostazione di Current non può essere eseguita in modo diretto. Se si tenta di impostare in modo diretto la proprietà Current il sistema genera un'eccezione InvalidOperationException, a meno che tale impostazione venga eseguita tramite la creazione di un ambito TransactionScope. Il valore dell'enumerazione EnterpriseServicesInteropOption viene ereditato dai nuovi ambiti di transazione che non specificano in modo esplicito il valore da utilizzare. Ad esempio, se si crea un nuovo oggetto TransactionScope con l'opzione Full e quindi si crea un secondo oggetto TransactionScope senza specificare alcuna opzione dell'enumerazione EnterpriseServicesInteropOption, l'opzione Full viene impostata automaticamente anche per il secondo oggetto TransactionScope.
In breve, quando si crea un nuovo ambito di transazione, si applicano le regole seguenti:
Viene eseguita la verifica della proprietà Current per stabilire se esiste una transazione. Questa verifica comporta quanto segue:
Viene eseguita una verifica per stabilire se esiste un ambito.
Se esiste un ambito, viene eseguita una verifica del valore dell'enumerazione EnterpriseServicesInteropOption passato al momento della creazione iniziale dell'ambito.
Se l'enumerazione EnterpriseServicesInteropOption è impostata su Automatic, la transazione COM+ (ovvero la transazione dello spazio dei nomi System.EnterpriseServices) ha la precedenza sulla transazione dello spazio dei nomi System.Transactions contenuta nell'archivio locale dei thread gestiti.
Se il valore è impostato su None, la transazione dello spazio dei nomi System.Transactions contenuta nell'archivio locale dei thread gestiti ha la precedenza.
Se il valore è Full, esiste una sola transazione ed è una transazione COM+.
Viene eseguita una verifica del valore dell'enumerazione TransactionScopeOption passato dal costruttore dell'ambito TransactionScope. Ciò determina se occorre creare una nuova transazione.
Se occorre creare una nuova transazione, i valori dell'enumerazione EnterpriseServicesInteropOption comportano quanto segue:
Full: viene creata una transazione associata a un contesto COM+.
None: viene creata una transazione dello spazio dei nomi System.Transactions.
Automatic: se esiste un contesto COM+, viene creata una transazione che quindi viene associata a tale contesto.
Nella tabella seguente vengono riportati il contesto di ES (Enterprise Services) e un ambito transazionale che richiede una transazione che utilizza l'enumerazione EnterpriseServicesInteropOption.
Contesto di ES | None | Automatic | Full |
---|---|---|---|
Contesto predefinito |
Contesto predefinito |
Contesto predefinito |
Creazione di un nuovo |
Contesto non predefinito |
Preservazione del contesto client |
Creazione di un nuovo contesto transazionale |
Creazione di un nuovo contesto transazionale |
Nella tabella seguente viene riportata la transazione di ambiente in funzione del contesto System.EnterpriseServices e un ambito transazionale che richiede una transazione che utilizza l'enumerazione EnterpriseServicesInteropOption.
Contesto di ES | None | Automatic | Full |
---|---|---|---|
Contesto predefinito |
ST |
ST |
ES |
Contesto non predefinito |
ST |
ES |
ES |
Nella tabella precedente:
ST indica che la transazione di ambiente dell'ambito è gestita dallo spazio dei nomi System.Transactions, indipendentemente dall'eventuale presenza di una transazione del contesto System.EnterpriseServices.
ES indica che la transazione di ambiente dell'ambito corrisponde alla transazione del contesto System.EnterpriseServices.