WCF - Transacciones
Una transacción en WCF es un conjunto de operaciones que siguen algunas propiedades, conocidas colectivamente como ACID. Aquí, si falla una sola operación, todo el sistema falla automáticamente. Cuando se realiza un pedido en línea, se realiza una transacción. El siguiente ejemplo puede ser útil para comprender el proceso de transacción en términos más simples.
Ejemplo
Suponga que ha pedido un televisor LCD en una tienda en línea y va a pagar el monto con su tarjeta de crédito. Cuando ingresa la información requerida para realizar el pedido, ocurren dos operaciones simultáneamente.
Uno, la cantidad especificada se debita de su cuenta bancaria y segundo, la cuenta del proveedor se acredita con la misma cantidad. Ambas operaciones deben ejecutarse con éxito para tener una transacción exitosa.
Propiedades de transacción de WCF
Las cuatro propiedades seguidas de una transacción WCF son las siguientes:
Atomic - Todas las operaciones deben actuar como una sola operación indivisible al finalizar una transacción.
Consistency - Cualquiera que sea el conjunto de operaciones, el sistema siempre está en un estado de coherencia, es decir, el resultado de la transacción es siempre el esperado.
Isolation - El estado intermedio del sistema no es visible para ninguna entidad del mundo exterior hasta que se completa la transacción.
Durability - El estado comprometido se mantiene independientemente de cualquier tipo de falla (hardware, corte de energía, etc.)
Al configurar una transacción WCF, hay algunos factores que exigen consideración. Estos son comportamientos vinculantes y operativos.
Binding- Los enlaces que admiten transacciones en WCF son solo algunos y es vital elegir solo estos enlaces, que permanecen deshabilitados de forma predeterminada y deben habilitarse para obtener el soporte necesario para la transacción. Estos enlaces son los siguientes:
- NetTcpBinding
- NetNamedPipeBinding
- WSHttpBinding
- WSDualHttpBinding
- WSFederationHttpBinding
Operation behavior- Mientras que un enlace facilita el camino para la propagación de la transacción, una operación se encarga del procesamiento de la transacción y de la configuración de la operación. El comportamiento de la operación utiliza principalmente dos atributos: TransactionFlow y TransactionScopeRequired. Aquí, debe tenerse en cuenta que TransactionFlow tiene principalmente tres valores y estos son: Permitido, Obligatorio y No permitido.
El siguiente código muestra si cambiar la configuración del contrato vinculante y de operación facilita la propagación del cliente.
<bindings>
<wsHttpBinding>
<binding name = "MandatoryTransBinding" transactionFlow = "true">
<reliableSession enabled ="true"/>
</binding>
</wsHttpBinding>
</bindings>
Protocolo de transacciones
WCF usa tres tipos de protocolos para la transacción:
- Lightweight
- Transacción Ole
- Transacción WS-Atomic (WS-AT)
De los tres, WS-AT es un protocolo interoperable y permite el flujo de transacciones distribuidas a través de firewalls. Sin embargo, este protocolo no debe utilizarse cuando la transacción se basa estrictamente en tecnología de Microsoft.
Fases de la transacción WCF
Hay dos fases en una transacción WCF como se muestra en la siguiente figura.
Prepare Phase - En esta fase, el administrador de transacciones verifica si todas las entidades están listas para comprometerse con la transacción o no.
Commit Phase - En esta fase se pone en marcha el compromiso de las entidades.
La siguiente figura ilustra las funciones de ambas fases de una transacción WCF.
Habilitación de una transacción WCF
Para habilitar una transacción WCF con éxito, es necesario seguir una serie de seis pasos de manera secuencial. Los pasos necesarios se describen a continuación.
Step 1 − Creation of two WCF Services
El paso más importante en este sentido es crear dos proyectos de servicio en WCF para participar en una sola transacción. Las transacciones de la base de datos se realizarán en ambos servicios y se entenderá cómo se unifican mediante una transacción WCF. También se ha creado una aplicación web de WCFTransactions para consumir los dos servicios creados en un único ámbito de transacción.
Step 2 − Method creation and its attribution with TransactionFlow attribute
Aquí, se creará un método UpdateData para que ambos servicios WCF lo inserten en la base de datos con el atributo OperationContract. Para realizar esta tarea, primero se crea una clase de interfaz con la ayuda del atributo ServiceContract. Para habilitar la transacción en el método recién creado, se atribuye a TransactionFlow y las transacciones se permiten usando el valor Permitido.
[ServiceContract]
public interface IService1 {
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void UpdateData();
}
Step 3− Implementation of WCF service with TransactionScopeRequired attribute
Se hace usando el código que se muestra a continuación:
[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
try {
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
Boolean doRollback = false;
using(SqlCommand cmd = new SqlCommand(
"insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
try {
cmd.ExecuteNonQuery();
} catch(SqlException) {
doRollback = true;
break;
}
}
if(doRollback)
transaction.Rollback();
else
transaction.Commit();
}
finally {
objConection.Close();
}
}
Step 4 − Enabling Transaction Flow by WCF Service Config File
Su codificación se realiza de la siguiente manera:
<bindings>
<wsHttpBinding>
<binding name = "TransactionalBind" transactionFlow = "true"/>
</wsHttpBinding>
</bindings>
Es vital adjuntar el enlace permitido de la transacción con el punto de conexión para exponer el servicio WCF.
<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">
Step 5 − Calling both the services in a single transaction
Aquí, los dos servicios anteriores se llaman en una transacción y, para este propósito, el objeto TransactionScope se usa para agrupar ambos servicios. Se llama al método Complete del objeto anterior para confirmar una transacción WCF. Para revertir, se debe llamar al método Dispose.
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
// Call your webservice transactions here
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
La pequeña parte del código completo en el que las transacciones WCF se han agrupado en un ámbito se muestra a continuación:
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
try {
ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
obj.UpdateData();
ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
obj1.UpdateData();
ts.Complete();
} catch (Exception ex) {
ts.Dispose();
}
}
Step 6 − Testing WCF transaction
Las pruebas se realizan en el sexto y último paso y, después de llamar al primer servicio WCF, se fuerza una excepción.