Serie de conferencias ASP (21) Creación de scripts transaccionales
Autor:Eve Cole
Fecha de actualización:2009-05-30 19:58:32
Las aplicaciones comerciales a menudo requieren la capacidad de ejecutar scripts y componentes dentro de transacciones. Una transacción es una operación del servidor, incluso si la operación incluye muchos pasos (por ejemplo, realizar pedidos, verificar el inventario, pagar facturas, etc.), solo puede devolver el éxito o el fracaso general de la operación. Los usuarios pueden crear scripts ASP que se ejecutan dentro de una transacción. Si alguna parte del script falla, toda la transacción finalizará.
El procesamiento de transacciones ASP se basa en Microsoft Transaction Server (MTS). Microsoft Transaction Server (MTS) es un sistema de procesamiento de transacciones para desarrollar, configurar y administrar aplicaciones de servidor de Internet e Intranet empresariales robustas, escalables y de alto rendimiento. Transaction Server proporciona un modelo de diseño de aplicaciones para desarrollar aplicaciones distribuidas basadas en componentes. También proporciona un entorno de ejecución para configurar y administrar estas aplicaciones.
La capacidad de crear scripts transaccionales está integrada en Internet Information Server y Personal Web Server. Si tiene instalado Microsoft Transaction Server, puede empaquetar componentes para que se ejecuten dentro de una transacción.
Acerca de las transacciones Una transacción es el éxito o fracaso general de una operación. El procesamiento de transacciones se utiliza para actualizar de manera confiable la base de datos. Al realizar muchos cambios relacionados en una base de datos o actualizar varias bases de datos simultáneamente, asegúrese de que todos los cambios se ejecuten correctamente. Si alguno de estos cambios falla, es necesario restaurar el estado original de las tablas de la base de datos.
Sin MTS, necesitaría escribir scripts y componentes para realizar un seguimiento manual de los cambios solicitados a fin de recuperar los datos si algunos cambios fallaran. Al utilizar MTS, simplemente declara sus scripts y componentes como "que requieren transacciones" y deja que MTS maneje la coherencia transaccional. El procesamiento de transacciones solo se aplica al acceso a la base de datos; MTS no puede recuperar cambios en el sistema de archivos u otros recursos no transaccionales. La base de datos a la que accede la aplicación debe ser compatible con MTS. Actualmente, MTS admite SQL Server y cualquier servidor que admita el protocolo XA (especificado por X/Open Association). MTS seguirá ampliando el soporte para otras bases de datos.
Las transacciones no pueden abarcar varias páginas ASP. Si una transacción requiere objetos de múltiples componentes, las operaciones que utilizan estos objetos deben combinarse en una página ASP. Por ejemplo, suponga que tiene un componente que actualiza una base de datos de nómina y un componente que actualiza los registros de empleados en una base de datos de recursos humanos. Para registrar nueva información salarial de un empleado, debe escribir un script que llame a estos dos componentes en un contexto de transacción, uno para actualizar la base de datos de nómina y el otro para actualizar la calificación del empleado en la base de datos de recursos humanos.
Declaración de scripts transaccionales Cuando declara una página como transaccional, todos los comandos y objetos de script en la página se ejecutan en el mismo entorno de transacción. Transaction Server maneja los detalles de la generación de transacciones y determina si la transacción tiene éxito (se confirma) o falla (termina). Para declarar una página como transaccional, agregue la directiva @TRANSACTION en la parte superior de la página:
<%@ TRANSACCIÓN = valor %>
El parámetro de valor puede ser uno de los siguientes:
significado del valor
Requires_New inicia una nueva transacción.
Requerido inicia una nueva transacción.
Soportado no inicia una transacción.
Not_Supported No inicia la transacción.
La directiva @TRANSACTION debe estar en la primera línea de una página; de lo contrario, se generará un error. Esta directiva debe agregarse a cada página que deba ejecutarse en una transacción. Cuando finaliza el procesamiento del script, finaliza la transacción actual.
La mayoría de las aplicaciones requieren un entorno de transacciones sólo para determinadas operaciones. Por ejemplo, es posible que el sitio de una aerolínea solo requiera scripts transaccionales para manejar la emisión de boletos y la disposición de asientos, mientras que todos los demás scripts pueden ejecutarse de forma segura sin un entorno transaccional. Debido a que las transacciones solo deben usarse para páginas que requieren procesamiento de transacciones, no declare que el archivo Global.asa de su aplicación sea transaccional.
Si se cancela una transacción, Transaction Server revierte cualquier cambio en los recursos respaldados por transacciones. Actualmente, sólo los servidores de bases de datos soportan completamente las transacciones porque los datos de la base de datos son más críticos para las aplicaciones empresariales. Transaction Server no restaura cambios en archivos, variables de sesión y aplicación, colecciones, etc. en el disco duro. Sin embargo, puede programar la restauración de variables y colecciones escribiendo eventos de transacción, como se describe en el siguiente tema. En ciertos momentos, su secuencia de comandos también puede confirmar o finalizar explícitamente una transacción, como cuando falla la escritura de datos en un archivo.
Confirmar o finalizar scripts Debido a que Transaction Server realiza un seguimiento del procesamiento de transacciones, determina si la transacción se realizó correctamente o falló. Un script puede finalizar explícitamente una transacción llamando a ObjectContext.SetAbort. Por ejemplo, un script necesita finalizar una transacción cuando recibe un mensaje de error de un componente, viola las especificaciones comerciales (por ejemplo, el saldo de una cuenta es menor que 0) o falla en operaciones no transaccionales, como leer y escribir archivos. Si la página se agota antes de que se complete la transacción, la transacción también debe finalizarse.
La escritura de scripts de eventos de transacciones por sí sola no determina si una transacción tiene éxito o falla. Sin embargo, puede escribir eventos que se invocan cuando se confirma o finaliza una transacción. Por ejemplo, si tiene un script que confirma una cuenta bancaria y necesita devolver páginas diferentes al usuario para diferentes estados de la transacción, puede usar los eventos OnTransactionCommit y OnTransactionAbort para escribir diferentes respuestas al usuario.
<%@ TRANSACCIÓN = Requerido %>
<%
'Salida en buffer para que se puedan mostrar diferentes páginas.
Respuesta.Buffer = Verdadero
%>
<HTML>
<CUERPO>
<H1>Bienvenido al servicio de banca online</H1>
<%
Establecer BankAction = Server.CreateObject("MyExample.BankComponent")
AcciónBanca.Depósito(Solicitud("NúmCuenta"))
%>
<P>Gracias. Su transacción se está procesando.</P>
</CUERPO>
</HTML>
<%
'Muestra esta página si la transacción se realiza correctamente.
SubOnTransactionCommit()
Respuesta.Escribir "<HTML>"
Respuesta.Escribir "<CUERPO>"
Respuesta.Escriba "Gracias. Su cuenta ha sido acreditada".
Respuesta.Escribe "</BODY>"
Respuesta.Escribe "</HTML>"
Respuesta.Flush()
sub final
%>
<%
'Muestra esta página si la transacción falla.
SubOnTransactionAbort()
Respuesta.Borrar()
Respuesta.Escribir "<HTML>"
Respuesta.Escribir "<CUERPO>"
Respuesta.Escriba "No podemos completar su transacción".
Respuesta.Escribe "</BODY>"
Respuesta.Escribe "</HTML>"
Respuesta.Flush()
Fin sub
%>
Registro de un componente en el Administrador de recursos de MTS Para participar en una transacción, el componente debe estar registrado en el paquete MTS y debe configurarse para requerir transacciones. Por ejemplo, si su secuencia de comandos maneja pedidos llamando a dos componentes, uno actualiza la base de datos de inventario y el otro actualiza la base de datos de pagos. Entonces, estos dos componentes deben ejecutarse en el mismo entorno de transacción. Transaction Server garantiza que si algún componente falla, no se actualizará ninguna base de datos. Algunos componentes no requieren transacciones; por ejemplo, el componente Ad Rotator.
Registre y configure componentes transaccionales utilizando MTS Resource Manager. Las propiedades de la transacción deben establecerse en Requerir transacción o Requerir nueva transacción. Los componentes de la transacción deben registrarse en el paquete MTS. En lugar de colocar componentes en paquetes en proceso de IIS, cree sus propios paquetes. Normalmente, todos los componentes deben colocarse en una biblioteca de componentes. Los componentes de la biblioteca de componentes pueden ser utilizados por múltiples aplicaciones ASP y ejecutarse en el proceso de la aplicación ASP. Utilice MTS Explorer para crear un nuevo paquete y establezca la propiedad Activación del paquete en Biblioteca.
Los componentes transaccionales también se pueden registrar en el paquete del servidor. Los paquetes de servidor normalmente se ejecutan como un proceso separado en el servidor. Si desea utilizar la verificación de seguridad basada en grupos funcionales o si desea que sus componentes sean accesibles para aplicaciones en computadoras remotas, use el paquete Servidor para componentes transaccionales.
Para utilizar MTS Explorer, se debe instalar Microsoft Transaction Server.
Alcance del objeto En general, no almacene objetos creados a partir de componentes MTS en objetos de sesión o aplicación ASP. Los objetos MTS desaparecen una vez completada la transacción. Dado que el objeto Sesión y el objeto Aplicación están diseñados para instancias de objetos utilizadas entre diferentes páginas ASP, no los utilice para almacenar objetos que se liberan al final de una transacción.
El script ASP es la raíz de la transacción declarada, el punto de partida. Cualquier objeto MTS utilizado por una página ASP transaccional se considera parte de la transacción. Cuando se complete la transacción, los objetos MTS utilizados en la página desaparecerán, incluidos los objetos almacenados en el objeto Sesión o Aplicación. Después de este punto, cualquier intento de llamar a un objeto con ámbito de sesión o de aplicación desde otra página transaccional fallará.
Cola de transacciones Las actualizaciones de una base de datos desde un servidor remoto pueden provocar que las transacciones se retrasen o finalicen debido a retrasos o fallas en la red. Debido a que todas las partes de la transacción deben confirmarse, la aplicación puede bloquearse, esperando un mensaje de confirmación o cancelación del servidor remoto, o la transacción puede cancelarse porque no se pueden enviar actualizaciones de la base de datos.
Para las actualizaciones que deben completarse simultáneamente, el enfoque correcto es finalizar la transacción o retrasar su finalización hasta que todos los participantes en la transacción puedan comprometerse. Por ejemplo, el proceso de reserva de una aerolínea debe debitar simultáneamente la cuenta bancaria del cliente y acreditar la cuenta bancaria de la aerolínea. Si una actualización es parte de una transacción general, pero puede ser posterior a otras actualizaciones, es posible que no desee hacer que el cliente espere a que se complete todo el proceso de actualización. Por ejemplo, una transacción de reserva de vuelo también podría enviar un pedido de comida a un proveedor de alimentos o actualizar la asignación de viaje de un cliente. Aunque estas operaciones deben completarse, se pueden realizar más adelante.
Microsoft Message Queue Server le permite agrupar una actualización o un conjunto de actualizaciones en un mensaje transaccional a un servidor remoto. Message Queue Server garantiza que las actualizaciones se enviarán al servidor remoto incluso si la red no está disponible actualmente. Su aplicación recibirá un mensaje de confirmación y podrá continuar procesando la transacción.