Condividi tramite


Escalation nella gestione delle transazioni

Windows ospita un set di servizi e moduli che insieme costituiscono un gestore transazioni. L'escalation nella gestione delle transazioni descrive il processo di migrazione di una transazione da un componente del gestore delle transazioni a un altro.

System.Transactions include un componente di gestione transazioni che coordina al massimo una transazione che coinvolge, una singola risorsa durevole o più risorse volatili. Poiché il gestore delle transazioni usa solo chiamate all'interno del dominio dell'applicazione, offre prestazioni ottimali. Gli sviluppatori non devono interagire direttamente con gestione transazioni. Invece, un'infrastruttura comune che definisce interfacce, comportamenti comuni e classi helper viene fornita dallo spazio dei nomi System.Transactions.

Quando si desidera fornire la transazione a un oggetto in un altro dominio applicativo (inclusi attraverso i limiti di processo e di macchina) nello stesso computer, l'infrastruttura System.Transactions esegue automaticamente l'escalation della transazione in modo che venga gestita da Microsoft Distributed Transaction Coordinator (MSDTC). L'escalation si verifica anche se si arruola un altro gestore di risorse durevoli. In caso di escalation, la transazione rimane gestita nel suo stato elevato fino al completamento.

Tra la System.Transactions transazione e la transazione MSDTC, esiste un tipo intermedio di transazione reso possibile tramite l'arruolamento a fase singola promuovibile (PSPE). PSPE è un altro meccanismo importante in System.Transactions per l'ottimizzazione delle prestazioni. Consente a una risorsa durevole remota, situata in un dominio dell'applicazione diverso, processo o computer, di partecipare a una System.Transactions transazione senza che venga trasformata in una transazione MSDTC. Per ulteriori informazioni su PSPE, consultare Reclutamento delle risorse come partecipanti a una transazione.

Come viene avviata l'escalation

L'escalation delle transazioni riduce le prestazioni perché l'MSDTC si trova in un processo separato e l'escalation di una transazione a l'MSDTC comporta l'invio di messaggi tra processi differenti. Per migliorare le prestazioni, è consigliabile ritardare o evitare l'escalation a MSDTC; pertanto, è necessario sapere come e quando viene avviata l'escalation.

Finché l'infrastruttura System.Transactions gestisce le risorse volatili e al massimo una risorsa durevole che supporta le notifiche a singola fase, la transazione rimane nella proprietà dell'infrastruttura System.Transactions . Il gestore delle transazioni si avvale solo di quelle risorse che risiedono nello stesso dominio applicazione e per cui la registrazione (scrittura del risultato della transazione su disco) non è necessaria. Un'escalazione che comporta il System.Transactions trasferimento della proprietà della transazione a MSDTC avviene quando:

  • Almeno una risorsa durevole che non supporta le notifiche a fase singola è inclusa nella transazione.

  • Almeno due risorse durevoli che supportano le notifiche a fase singola vengono inserite nella transazione. Ad esempio, l'integrazione di una singola connessione con SQL Server 2005 non comporta la promozione di una transazione. Tuttavia, ogni volta che si apre una seconda connessione a un database di SQL Server 2005 che richiede l'arruolamento del database, l'infrastruttura System.Transactions rileva che si tratta della seconda risorsa durevole nella transazione ed esegue l'escalation a una transazione MSDTC.

  • Viene richiamata una richiesta di "marshalling" della transazione a un dominio applicazione diverso o a un processo diverso. Ad esempio, la serializzazione dell'oggetto transazione attraverso il limite del dominio dell'applicazione. L'oggetto transazione è tradotto per valore, ovvero qualsiasi tentativo di passarlo attraverso un limite di dominio dell'applicazione (anche nello stesso processo) comporta la serializzazione dell'oggetto transazione. È possibile passare gli oggetti transazione effettuando una chiamata a un metodo remoto che accetta un oggetto Transaction come parametro oppure è possibile provare ad accedere a un componente transazionale remoto. In questo modo, l'oggetto transazione viene serializzato e ne risulta un'escalation, come quando una transazione viene serializzata in un dominio applicativo. Viene distribuito e il gestore transazioni locale non è più adeguato.

Nella tabella seguente sono elencate tutte le possibili eccezioni che possono essere generate durante l'escalation.

Tipo di eccezione Condizione
InvalidOperationException Tentativo di escalation di una transazione con un livello di isolamento pari a Snapshot.
TransactionAbortedException Il gestore delle transazioni è inattivo.
TransactionException L'incremento dei privilegi fallisce e l'applicazione viene interrotta.