Este objeto se utiliza para controlar las transacciones de datos que se realizan en ASP a través del MTS... Aunque puede que no sepas lo que es el MTS ni una transacción.
Como transacción entenderemos cualquier movimiento de datos que se produzca entre el servidor web y el cliente que solicita los datos, entendiendo este movimiento como un conjunto. Si éste movimiento se realiza por completo, sin producirse ningun error, entonces se dice que la transacción ha concluido en commit, y si no termina bien, por producirse algún problema en la DB, en el código SQL de la consulta, en el código ASP o por no cumplirse alguna condición de las programadas en la aplicación, se dice que la transacción ha concluido en abort.
Por ejemplo, imaginemos una típica aplicación de comercio electrónico. En primer lugar el usuario se da de alta como cliente, y a continuación hace un pedido cualquiera. Por cualquier razón se produce un fallo cuando la aplicación va a guardar el pedido en la base de datos. En ese momento, MTS entraría en acción y anularía toda la transacción, incluida el alta del cliente que sí terminó bien.
Haría falta todo un libro para explicar como funciona el MTS (Microsoft Transaction Server), así que nos conformaremos con saber que es una especie de "intermediario" entre el IIS y el sistema. Se instala automáticamente durante el proceso de instalación del Option Pak (no confundir con los Service Pak, que son actualizaciones del sistema operativo) para Windows NT Server, que es el paquete que instala el IIS con las extensiones ASP en el servidor. El MTS controla los recursos físicos y lógicos necesarios para que las transacciones con el cliente funcionen lo mejor posible, sin interferirse unas con otras, y liberando los recursos cuando éstas terminan. La razón de su existencia es, además de la optimización de recursos, la de poder controlar si una transacción ha concluido correctamente o no en tiempo real, cosa que, sin el MTS, sólo es posible saber cuando se produce un error por tiempo excedido, es decir, mucho tiempo después de haberse producido el error.
Para poder utilizar este objeto, hay que invocar primero una directiva de ASP llamada @Transaction, y que debe escribirse antes que cualquier otra línea de código de las necesarias para producir la transacción.
El objeto ObjectContext tiene 2 métodos y 2 eventos:
El siguiente ejemplo contiene una incongruencia de programa. Tiene limitado el tiempo de ejecución a 5 segundos. Como su proceso normal necesita más tiempo, se produce un evento OnTransactionAbort:
<%
Sub OnTransactionAborted()
@Transaction=Required Language="VBScript"
Response.Buffer = TRUE
Server.ScriptTimeout = 5
%>
<HTML>
<HEAD><TITLE>PRUEBA</TITLE></HEAD>
<BODY>
<%
Do
x=x+1
Response.Write x & "<BR>"
Loop While x < 10000
%>
</BODY>
</HTML>
Response.Write "La transacción ha abortado por exceso de tiempo en su ejecución."
End Sub
Y este sería el resultado:
La transacción ha abortado por exceso de tiempo en su ejecución.
El siguiente ejemplo no contiene ningún error de programa. Como su proceso terminará normalmente, se produce un evento OnTransactionCommit :
<% @Transaction=Required Language="VBScript" %>
Sub OnTransactionCommit()
Sub OnTransactionAborted()
<HTML>
<HEAD><TITLE>PRUEBA</TITLE></HEAD>
<BODY>
<%
Do
x=x+1
Response.Write x & "<BR>"
Loop While x < 5
%>
</BODY>
</HTML>
Response.Write "La transacción ha terminado correctamente"
End Sub
Response.Write "La transacción ha abortado por exceso de tiempo en su ejecución."
End Sub
Y este sería el resultado:
1
2
3
4
5
La transacción ha terminado correctamente.
<% @Transaction=Required Language="VBScript" %>
Sub OnTransactionAborted()
Sub OnTransactionCommit()
<HTML>
<HEAD><TITLE>PRUEBA</TITLE></HEAD>
<BODY>
<%
Set DB = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
SQL ="SELECT convert(char(8), nom_dni) + nom_nif AS 'NIF', " & _
"nom_apellidos AS 'Apellidos', " & _
"nom_nombre AS 'Nombre', " & _
"nom_postal AS 'Postal' " & _
"nom_postal + ' ' + nom_localidad AS 'Localidad', " & _
"nom_provincia AS 'Provincia' " & _
"FROM nombres WHERE nom_dni = 12345678 "
DB.Open "DB_nombre", "DB_user", "DB_password"
RS.Open SQL, DB
If RS.EOF AND RS.BOF Then
ObjectContext.SetAbort
Else
Response.Write("<TABLE BORDER=1>")
For i = 0 to RS.Fields.Count - 1
Response.Write("<TR><TH>")
Response.Write(RS(i).Name)
Response.Write("</TH><TD>")
Response.Write(RS(i))
Response.Write("</TD></TR>")
Next
Response.Write("</TABLE> <P>")
ObjectContext.SetComplete
End if
RS.Close
Set RS = Nothing
DB.Close
Set DB = Nothing
%>
</BODY>
</HTML>
Response.Write "Transacción abortada. No se encontraron registros"
End Sub
Response.Write "Transacción realizada."
End Sub
Si todo termina bien, éste sería el resultado:
Transacción realizada.
NIF 12345678Z Apellidos Garcia Nombre Juan Postal 12345 Localidad 12345 Villa Desconocida Provincia Guadalajara
Y si el registro buscado no se encuentra, al no concluir la transacción, solamente obtendremos esto:
Transacción abortada. No se encontraron registros