Condividi tramite


Opzioni di voto nelle transazioni automatiche

Le classi .NET Framework e le pagine ASP.NET possono votare se completare o interrompere la propria transazione corrente. L'assenza di un voto esplicito nel codice viene interpretata come un voto di commit in base all'impostazione predefinita. Il commit predefinito, tuttavia, può influenzare negativamente le prestazioni dell'applicazione allungando il tempo necessario a ciascuna transazione per rilasciare risorse dispendiose.

Il voto esplicito consente inoltre alla classe o alla pagina di interrompere una transazione se si verifica un errore significativo. È inoltre possibile migliorare le prestazioni dell'applicazione rilevando un errore irreversibile all'inizio della transazione, terminando la transazione e rilasciando le risorse interessate.

Utilizzo di AutoComplete

L'attributo System.EnterpriseServices.AutoCompleteAttribute fa sì che un oggetto che partecipa a una transazione voti a favore del completamento della transazione se il metodo restituisce risultati normali. Se la chiamata del metodo genera un'eccezione, la transazione verrà invece interrotta. È possibile applicare questo attributo solo a classi derivate dalla classe ServicedComponent.

Per avvalersi di questa caratteristica, inserire l'attributo prima del metodo della classe. Se si aggiunge l'attributo a un metodo di interfaccia, Common Language Runtime lo ignorerà. Il frammento di codice che segue illustra la posizione dell'attributo su una classe che supporta le transazioni.

<Transaction(TransactionOption.Supported)> Public Class Account
   Inherits ServicedComponent
   
   <AutoComplete()> Public Sub Debit(amount As Integer)
      ' Do some database work. Any exception thrown here aborts the 
      ' transaction; otherwise, transaction commits.
   End Sub
End Class
[C#]
[Transaction(TransactionOption.Supported)]
public class Account : ServicedComponent {
    [AutoComplete]
    public void Debit(int amount) {
        // Do some database work. Any exception thrown here aborts the transaction; 
        // otherwise, transaction commits.
    }
}

Utilizzo di SetAbort e SetComplete

È possibile utilizzare la classe System.EnterpriseServices.ContextUtil, che espone il metodo SetComplete o SetAbort, per completare o interrompere esplicitamente una transazione. SetComplete indica che l'oggetto vota per il commit, mentre SetAbort indica che l'oggetto ha rilevato un problema e vota per l'interruzione della transazione in corso. Una transazione non viene né completata né interrotta finché non viene disattivato l'oggetto di primo livello della transazione. È inoltre sufficiente un unico voto di interruzione da parte di un qualsiasi oggetto partecipante alla transazione perché l'intera transazione abbia esito negativo.

Il frammento di codice che segue illustra l'utilizzo dei metodi SetAbort e SetComplete.

'Try to do something crucial to the transaction in progress.
If Not DoSomeWork() Then
   'Something goes wrong.
   ContextUtil.SetAbort()
Else
   'All goes well.
   ContextUtil.SetComplete()
End If
[C#]
//Try to do something crucial to the transaction in progress.
if( !DoSomeWork() )
{
  //Something goes wrong.
  ContextUtil.SetAbort();
}
else
{
  //All goes well.
  ContextUtil.SetComplete();
}

Vedere anche

Transazioni automatiche