Configurazione delle transazioni
L'attributo transaction è una proprietà dichiarativa che gestisce automaticamente le transazioni per lo sviluppatore di componenti. Impostando questo attributo, si elimina la necessità di usare controlli di transazione espliciti nel componente.
COM+ usa l'attributo della transazione del componente per determinare il tipo di protezione delle transazioni necessaria per ogni oggetto attivato. A seconda del requisito, un oggetto può condividere la transazione del chiamante, richiedere una nuova transazione o operare senza protezione delle transazioni.
COM+ fornisce i valori degli attributi delle transazioni seguenti:
-
Disabili
-
In generale, è consigliabile impostare questo valore di attributo solo quando si è certi che il componente non accede mai a un gestore risorse. Quando si disabilita l'attributo della transazione, COM+ ignora i requisiti transazionali del componente per determinare la posizione del contesto dell'oggetto. Di conseguenza, l'oggetto può condividere il contesto del chiamante (e la transazione). Quando si esegue la migrazione di un componente COM a COM+, è necessario disabilitare l'attributo della transazione per mantenere lo stesso comportamento transazionale del componente COM non configurato.
Nota
Un componente non configurato è un componente COM che non è stato installato in un'applicazione COM+.
-
Non supportato
-
Quando si imposta questo valore di attributo, COM+ garantisce che qualsiasi oggetto creato dal componente non partecipi mai a una transazione, indipendentemente dallo stato transazionale del chiamante. Dichiarando questo valore, si garantisce che un oggetto non voti nella transazione del chiamante né possa avviare una transazione di propria proprietà. Not Supported è il valore predefinito per tutti i componenti.
-
Supportati
-
Quando si imposta questo valore di attributo, COM+ garantisce che qualsiasi oggetto creato dal componente partecipi a una transazione, se presente. Questo valore viene dichiarato quando si desidera che un oggetto condivida nella transazione del chiamante senza richiedere una transazione di propria proprietà.
-
Obbligatorio
-
Quando si imposta questo valore di attributo, COM+ garantisce che qualsiasi oggetto creato dal componente sia transazionale. Quando COM+ attiva un oggetto con l'impostazione Obbligatorio, esamina lo stato transazionale del chiamante. Se il chiamante dispone di una transazione, il nuovo oggetto viene incluso nella transazione corrente. In caso contrario, COM+ avvia una transazione, rendendo il nuovo oggetto la radice della transazione. Si tratta dell'impostazione preferita per un componente che esegue attività di risorse perché consente di fornire protezione delle transazioni per tali attività.
-
Richiede nuovo
-
Quando si imposta questo valore di attributo, COM+ garantisce che tutti gli oggetti creati dal componente debbano partecipare a una nuova transazione come radice della transazione, indipendentemente dallo stato transazionale del chiamante. COM+ avvia automaticamente una nuova transazione distinta dalla transazione del chiamante.
Nota
COM+ non supporta transazioni nidificate. Quando un oggetto transazionale chiama un altro componente contrassegnato come Richiede nuovo, COM+ crea un limite transazionale indipendente per l'oggetto appena attivato. La seconda transazione non può influire sulla prima transazione, a meno che la prima transazione non annoi in modo esplicito i risultati della seconda transazione e modifichi il voto in base a tali risultati.
Dipendenze degli attributi delle transazioni
La tabella seguente illustra le caratteristiche di ogni valore dell'attributo transazione COM+, incluso l'effetto del valore sulle caratteristiche delle transazioni. COM+ applica l'attivazione JIT e la sincronizzazione per tutti i componenti delle transazioni.
Valore attributo | Nuova transazione | Transazione del client | Radice transazione | Attivazione JIT | Sincronizzazione |
---|---|---|---|---|---|
Disabled |
Mai |
Forse |
Mai |
Facoltativo |
Facoltativo |
Non supportato |
Mai |
Mai |
Mai |
Facoltativo |
Facoltativo |
Supportata |
Mai |
Se il client dispone di una transazione |
Mai |
Richiesto |
Obbligatorio |
Richiesto |
Forse |
Se il client dispone di una transazione |
Se il client non dispone di alcuna transazione |
Richiesto |
Richiesto |
RequiresNew |
Sempre |
Mai |
Sempre |
Richiesto |
Richiesto |
Limiti delle transazioni
Una transazione ha un inizio, una fine e si verifica esattamente una volta. Durante l'esecuzione, una transazione può chiamare su una risorsa, ad esempio un database o una coda, per eseguire una o più attività. Ogni risorsa rientra nel limite della transazione. Tutte le risorse all'interno di un limite di transazione, che possono estendersi su più limiti di processo e computer, condividono una singola transazione. La gestione della coerenza tra questi processi e limiti del computer è importante.
COM+ garantisce la coerenza gestendo automaticamente i limiti delle transazioni, in base al valore dell'attributo della transazione impostato per ogni componente. Una transazione COM+ passa automaticamente agli oggetti incaricati di partecipare a una transazione e ignora gli oggetti richiesti per l'esecuzione all'esterno di una transazione. COM+ non supporta transazioni nidificate. Le transazioni COM+ sono invece distinte e di breve durata.
Il primo oggetto in un limite di transazione è speciale per la transazione e viene chiamato oggetto radice della transazione. In una transazione può essere presente un solo oggetto radice. Tutti gli altri oggetti nella gerarchia transazionale all'interno dell'oggetto radice vengono chiamati oggetti interni.
Mapping delle transazioni
Un modo per assicurarsi che un oggetto sia incluso nel limite di transazione corretto consiste nell'eseguire il mapping delle transazioni prima di iniziare a scrivere i componenti. Eseguendo il mapping delle transazioni, è possibile determinare l'impostazione migliore per ogni componente scritto. Più si è certi di come usare i componenti, più facile è selezionare il valore corretto dell'attributo della transazione.
In fase di esecuzione, COM+ esamina l'attributo della transazione per determinare se un oggetto deve essere la radice di una nuova transazione, essere creato in una transazione esistente o essere creato come oggetto non transazionale.
La figura seguente mostra un possibile mapping delle transazioni. Nell'illustrazione il client crea l'oggetto 1, che richiede una transazione. Poiché non esiste alcuna transazione, COM+ crea la transazione 1 e ne inserisce l'oggetto 1 come oggetto radice. L'oggetto 1 crea l'oggetto 2, che supporta le transazioni e viene quindi inserito nella transazione 1. L'oggetto 2 crea l'oggetto 3, che non supporta le transazioni e pertanto viene posizionato all'esterno di tutte le transazioni. L'oggetto 2 crea anche l'oggetto 4, che richiede una transazione e viene quindi inserito nella transazione 1. L'oggetto 3 crea l'oggetto 5, che supporta le transazioni. Tuttavia, poiché l'oggetto 5 viene creato da un oggetto che non esiste all'interno di una transazione, viene inoltre posizionato all'esterno di tutte le transazioni. L'oggetto 4 crea l'oggetto 6, che richiede una nuova transazione, quindi COM+ crea La transazione 2 e inserisce l'oggetto 6 come oggetto radice. L'oggetto 6 crea l'oggetto 7, che supporta le transazioni e viene quindi inserito nella transazione 2.
La figura precedente mostra due potenziali aree problematiche. In primo luogo, la maggior parte del lavoro è suddivisa tra due transazioni distinte. Se la transazione 1 ha esito negativo dopo che l'oggetto 4 crea l'oggetto 6, la transazione 2 non viene influenzata dal risultato della transazione 1. Se questo risultato non è previsto, è preferibile piegare le operazioni di entrambe le transazioni in una singola transazione, che è possibile eseguire modificando l'attributo della transazione dell'oggetto 6 su Obbligatorio.
La figura di mapping mostra anche che l'oggetto 3 e l'oggetto 5 non sono transazionali, in esecuzione completamente all'esterno dell'ambito delle transazioni 1 e 2. Se l'oggetto 5 aggiorna i dati persistenti, è possibile riconsiderare lo stato non transazionale. L'oggetto 5 può essere inserito all'interno di una transazione modificandone l'attributo della transazione su Obbligatorio.