El soporte de transacciones para servicios web XML aprovecha el soporte en Common Language Runtime, que se basa en el mismo modelo de transacciones distribuidas que se encuentra en Microsoft Transaction Server (MTS) y COM+ Services. Este modelo se basa en determinar explícitamente si un objeto participa en una transacción, en lugar de escribir código específico para manejar la delegación y las devoluciones de llamada para una transacción. Para un servicio web XML creado con ASP.NET, puede declarar el comportamiento de transacción de un servicio web XML configurando el atributo TransactionOption del atributo WebMethod que se aplica a un método de servicio web XML. Si se lanza una excepción cuando se ejecuta el método del servicio web XML, la transacción finaliza automáticamente; por el contrario, si no ocurre ninguna excepción, la transacción se delega automáticamente;
El atributo TransactionOption del atributo WebMethod especifica cómo participa un método de servicio web XML en una transacción. Aunque este nivel de declaración representa una lógica de transacción, está a un paso de la transacción real. La transacción real ocurre cuando un objeto de transacción accede a una fuente de datos (como una base de datos o una cola de mensajes). Las transacciones asociadas con este objeto fluyen automáticamente al administrador de recursos apropiado. Un proveedor de datos de .NET Framework como el proveedor de datos de .NET Framework (para SQL Server u OLE DB) busca transacciones en el contexto de un objeto y las cataloga a través de un Coordinador de transacciones distribuidas (DTC, Coordinador de transacciones distribuidas). Todas las transacciones se generan automáticamente.
Los métodos de servicio web XML sólo pueden participar en una transacción que sea la raíz de una nueva transacción. Como raíz de una nueva transacción, todas las interacciones con administradores de recursos (como servidores que ejecutan Microsoft SQL Server, Microsoft Message Queuing y Microsoft Host Integration Server) mantienen las propiedades ACID necesarias para ejecutar aplicaciones distribuidas sólidas. Los métodos de servicio web XML que llaman a otros métodos de servicio web XML participan en transacciones diferentes porque las transacciones no fluyen a través de métodos de servicio web XML.
Declare un servicio web XMLutilizando transacciones de métodos de servicio web XML
.
[DO#]
<%@ WebService Language="C#" Class="Pedidos" %>
[Visual Básico]
<%@ WebService Language="VB" Class="Orders" %>
Agregue una instrucción ensambladora a System.EnterpriseServices.
<%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
Agregue referencias a los espacios de nombres de dominio System.Web.Services y System.EnterpriseServices.
[DO#]
utilizando System.Web.Services;
utilizando System.EnterpriseServices;
[Visual Básico]
Importaciones Sistema.Web.Servicios
Imports System.EnterpriseServices
declara un método de servicio web XML y establece la propiedad TransactionOption del atributo WebMethod en TransactionOption.RequiresNew.
[DO#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor (cadena apellido)
[Visual Básico]
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Función pública DeleteAuthor(apellido como cadena) como entero
El siguiente ejemplo de código muestra un servicio web XML que utiliza un único método de servicio web XML y llama a DeleteDatabase. Este método de servicio web XML realiza una operación de base de datos dentro del alcance de una transacción. Si la operación de la base de datos genera una excepción, la transacción se detiene automáticamente; de lo contrario, la transacción se confirma automáticamente.
[DO#]
<%@ WebService Language="C#" Class="Pedidos" %>
<%@ Nombre del ensamblado="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
usando Sistema;
usando System.Data;
usando System.Data.SqlClient;
utilizando System.Web.Services;
usando System.EnterpriseServices
pedidos de clase pública: WebService;
{
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor (cadena apellido)
{
Cadena eliminarCmd = "ELIMINAR DE los autores DONDE au_lname='" +
apellido + "'" ;
Excepción de cadenaCausingCmdSQL = "ELIMINAR DE tabla no existente DONDE
au_lname='" + apellido + "'";
SqlConnection sqlConn = nueva SqlConnection(
"Persistir información de seguridad = Falso; Seguridad integrada = SSPI; base de datos = pubs; servidor = mi servidor")
;
Excepción de SqlCommandCausingCmd = nuevo
SqlCommand(exceptionCausingCmdSQL,sqlConn);
// Este comando debería ejecutarse correctamente.
eliminarCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// Este comando genera una excepción, por lo que el primer comando es
// se revierte automáticamente ya que el método del servicio web XML es
// participa en una transacción y ocurre una excepción, ASP.NET
// cancela automáticamente la transacción.
// ejecutado correctamente se revierte.
int cmdResult = excepciónCausingCmd.ExecuteNonQuery();
sqlConn.Close()
;
}
}
[Visual Básico]
<%@ WebService Language="VB" Class="Pedidos" %>
<%@ nombre del ensamblado="System.EnterpriseServices" %>
Sistema de importaciones
ImportacionesSystem.Data
Importaciones System.Data.SqlClient
Importaciones Sistema.Web.Servicios
Importaciones System.Web.Util
Importa
pedidos de clase pública
System.EnterpriseServices<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Función pública DeleteAuthor (apellido como cadena) como entero
Dim eliminarCmdSQL como cadena = "BORRAR DE los autores DONDE au_lname='" + _
apellido + "'"
Excepción tenueCausingCmdSQL As String = "BORRAR DE" + _
"NonExistingTable WHERE au_lname='" + apellido + "'"
Dim sqlConn As SqlConnection = New SqlConnection( _
"Persistir información de seguridad = Falso; Seguridad integrada = SSPI; base de datos = pubs; servidor = mi servidor")
Dim deleteCmd As SqlCommand = New SqlCommand (deleteCmdSQL, sqlConn)
Excepción tenueCausingCmd As SqlCommand = Nuevo _
SqlCommand(exceptionCausingCmdSQL,sqlConn)
'Este comando debería ejecutarse correctamente.
eliminarCmd.Connection.Open()
deleteCmd.ExecuteNonQuery()
' Este comando genera una excepción, por lo que el primer comando es
' se revierte automáticamente ya que el método del servicio web XML es.
'participando en una transacción y ocurre una excepción, ASP.NET
' aborta automáticamente la transacción.
'ejecutado correctamente se revierte
Dim cmdResult As Integer = excepciónCausingCmd.ExecuteNonQuery().
sqlConn.Close()
Devuelve cmdResult
Función final
Fin de clase