Votación en una transacción automática
Las clases de .NET Framework y las páginas de ASP.NET pueden votar la confirmación o la anulación de la transacción actual. La ausencia de un voto explícito en el código supone la emisión de un voto de confirmación de forma predeterminada. Sin embargo, la confirmación predeterminada puede reducir el rendimiento de la aplicación prolongando el tiempo que tarda cada transacción en liberar recursos caros.
La votación explícita también permite que la clase o la página anulen una transacción si se encuentra un error relevante. De nuevo, se puede mejorar el rendimiento de la aplicación detectando un error grave en una fase temprana de la transacción, finalizando la transacción y liberando los recursos.
Utilizar AutoComplete
El atributo System.EnterpriseServices.AutoCompleteAttribute hace que un objeto participe en una transacción para votar a favor de su finalización si el método devuelve valores normalmente. Si la llamada al método inicia una excepción, la transacción se anula. Este atributo sólo se puede aplicar a clases que se derivan de la clase ServicedComponent.
Para utilizar esta función, se ha de insertar el atributo delante del método de la clase. Si se añade el atributo a un método de interfaz, Common Language Runtime no lo tiene en cuenta. El fragmento de código siguiente muestra la colocación del atributo en una clase relacionada con transacciones.
<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.
}
}
Utilizar SetAbort y SetComplete
Se puede utilizar la clase System.EnterpriseServices.ContextUtil, que expone los métodos SetComplete o SetAbort, para confirmar o anular explícitamente una transacción. El método SetComplete indica que el objeto vota la confirmación del trabajo; el método SetAbort indica que el objeto ha encontrado un problema y vota la anulación de la transacción en proceso. Una transacción no se confirma ni se anula hasta que el objeto principal de la transacción se desactiva. Además, un solo voto de anulación procedente de un objeto que participa en la transacción provoca el error de la transacción en su totalidad.
El fragmento de código siguiente muestra la utilización de los métodos SetAbort y 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();
}