Objet ObjectContext  

Depuis la version 2.0, une importante fonction d'Active Server Pages consiste à créer un script transactionnel, c'est-à-dire un script dont les segments de code qui le constituent, réussissent tous ou échouent en tant que groupe. Par exemple, si vous utilisez ce type de script, une section de code supprime un enregistrement d'un tableau d'inventaire, et une autre section ajoute un enregistrement dans un tableau de registre des ventes. Toutefois, le script ne réussit que si les deux sections de code réussissent. Si la suppression de l'enregistrement de l'inventaire ou l'ajout de l'enregistrement de la vente échoue, le script échoue à son tour. Les deux processus sont rétablis à leur état précédent : l'enregistrement supprimé, s'il a été supprimé, est ajouté de nouveau dans la base de données et l'enregistrement de la vente, s'il a été ajouté, est supprimé du tableau de registre des ventes. La possibilité de combiner plusieurs fonctions dans une même unité transactionnelle, réussissant ou échouant en tant que groupe, représente une importante amélioration de la puissance des applications ASP. Auparavant, les transactions dépendaient de la prise en charge de la base de données.

Les transactions d'application ASP sont contrôlées par les services COM+ Component Services de Windows 2000 ou par MTS (Microsoft Transaction Server) de Windows NT. Cet élément de la suite BackOffice permet de contrôler toutes les actions de base de données codées dans ce but. La prise en charge des scripts transactionnels est intégrée dans IIS et PWS (Personal Web Server) et elle ne requiert aucune configuration spéciale. Sans COM+ Component Services ou, dans ASP 2.0, sans prise en charge transactionnelle MTS, vos applications devront suivre manuellement toutes les modifications dans les bases de données, ainsi que rétablir manuellement toutes les actions de base de données. Elles devront suivre les activités multiutilisateur, ainsi que les activités simultanées, etc. MTS ou COM+ Component Services proposent cette prise en charge avec un minimum de codage à condition que la base de données de connexion de votre application soit Microsoft SQL Server ou son support, le protocole XA du consortium X/Open. Notez que cela signifie que les actions de fichier ne sont pas encore prises en charge ou du moins qu'elles ne sont pas prises en charge automatiquement.

La prise en charge ASP de transactions est codée par l'utilisation de l'objet ObjectContext, lequel représente l'objet ObjectContext de COM+ Component Services lui-même. En appelant des méthodes de l'objet ObjectContext et en codant les événements, vous pouvez créer un script transactionnel avec à peine quelques lignes supplémentaires de code.

Pour déclarer tout le script sur une page donnée comme script transactionnel, ajoutez simplement la ligne de code suivante comme première ligne dans le script.

<%@ TRANSACTION = Required %>

Pour plus de détails sur la directive ASP TRANSACTION, voir le chapitre 11. A ce niveau, il est important, que cette ligne soit la première dans votre script ; elle indique au serveur Web d'utiliser l'interface Component Services pour assurer la réussite ou l'échec du script en tant qu'unité.

Pour confirmer la transaction ou pour l'annuler, il suffit d'appeler la méthode SetComplete ou SetAbort de l'objet ObjectContext, respectivement. Si vous utilisez une transaction complexe contenant des segments de code qui ne sont pas pris en charge par Component Services (notamment les actions de fichier), vous pouvez créer un code adapté à ces actions dans les événements ObjectContext, OnTransactionCommit et OnTransactionAbort. Dans la section de référence, plus loin dans ce chapitre, plusieurs exemples de ces méthodes et procédures d'événement sont présentés.

Commentaires/Dépannage  
 
 

Il existe actuellement deux importantes limitations de construction de scripts transactionnels :

    Uniquement les actions de base de données sont prises en charge, et uniquement le serveur SQL et les bases de données compatibles avec le protocole XA sont prises en charge par COM+ Component Services ou MTS.

    Une transaction doit contenir dans une seule page ASP. Par conséquent, vous devez créer vos pages soigneusement : elles doivent inclure toutes les actions requises par vos transactions sans pour autant être de taille à ralentir le traitement de la page d'un pourcentage trop élevé.

Si vous écrivez vous-même vos composants serveur pour compléter certaines ou toutes les actions de base de données dans votre transaction, vous devez enregistrer ces composants dans un package MTS. (La prise en charge des transactions MTS n'est disponible que si le composant est enregistré. En outre, vous devez créer vos packages de bibliothèques, et ne pas inclure votre composant dans le package IIS in-process. Les packages de bibliothèques personnalisés sont utilisés par de multiples applications ASP et ils sont exécutés dans le même processus que la bibliothèque de liens dynamiques (DLL) ASP. La configuration de packages de bibliothèques permet de mettre votre composant à la disposition de vos applications pour leur réutilisation. Cette mise en commun des ressources est également gérée par MTS. Vous pouvez également ajouter vos composants à un package de serveur, mais cela n'est requis que pour les transactions basées sur des rôles ou les transactions s'exécutant sur des ordinateurs distants.)

Pour plus d'informations sur l'objet ObjectContext et sur les composants serveur, voir Developing ASP Components, écrit par Shelley Powers et publié par O'Reilly & Associates.

Notez que vous devez éviter d'attribuer aux objets fonctionnant dans les transactions une étendue de niveau session ou application, car les objets transactionnels sont désactivés à la fin de leur transaction. Si vous attribuez à un tel objet une étendue session ou application, les appels après la fin de la transaction échouent et génèrent une erreur.

Bien que les transactions soient uniquement prises en charge pour les actions de base de données, vous pouvez ajouter du code dans les procédures d'événement OnTransactionCommit et OnTransactionAbort pour créer votre propre prise en charge transactionnelle indépendante de la base de données. Par exemple, vous pouvez facilement utiliser le code dans ces procédures d'événement pour écrire ou supprimer des fichiers du système de fichiers en cas de réussite ou d'échec d'une transaction donnée.

L'objet ObjectContext expose six méthodes autres que celles qui sont accessibles via ASP. Toutefois, ces méthodes sont accessibles uniquement à travers du code dans les composants serveur, géré par COM+ Component Services ou MTS. Elles ne sont donc pas documentées ici.

L'ajout de scripts transactionnels représentent un atout majeur dans ASP. Si vous ne disposez d'un accès aux transactions de base de données que par le biais d'objets de données ActiveX, cette nouvelle fonction peut toujours vous être utile. Toutefois, en créant des composants serveur personnalisés, vous pouvez créer des transactions complexes et puissantes.

SetAbort  
ObjectContext.SetAbort
 

Annule la transaction entière. Lorsqu'elle est appelée, la transaction échoue, sans tenir compte du code déjà traité ou non dans votre script.

Vous pouvez utiliser cette méthode dans votre script après un test pour la finalisation d'une partie donnée de la transaction, ou un composant serveur géré par MTS ou COM+ Component Services peut appeler cette méthode. L'appel à SetAbort rétablit les parties de la transaction déjà réalisées et appelle la procédure d'événement ObjectContext_OnTransactionAbort s'il en existe une dans votre script.

 
Paramètres

Aucun

 
Exemple
<%

' The following code tests the result from a method call
' to a custom server component that attempts to remove
' a book from the inventory table and then tests the
' results from a credit card check.

' Based on this code and the segment that follows it, the 
' script will call either the SetAbort or the SetComplete 
' method of the ObjectContext object.

' Attempt to sell 2 copies of the book Animal Farm.
intBooks = MyInventory.SellBook("Animal Farm", 2)

' Check the credit card given by the client.
intCheckCC = MyCreditChecker.ChkCard("0001231234")

If intBooks = 2 And intCheckCC = 0 Then

   ' Complete the transaction. Two copies of the book 
   ' are in the inventory and the credit card checks out.
   ObjectContext.SetComplete

Else

   ' Abort the transaction. Either there are not two 
   ' copies of the book in the inventory or the credit 
   ' card did not check out.
   ObjectContext.SetAbort

End If

%>
 
Remarques

Tout segment d'un script transactionnel peut appeler la méthode SetAbort. Notez que si vous disposez de code existant après l'appel à SetAbort, il ne sera pas traité jusqu'à la fin de l'exécution de la procédure d'événement OnTransactionAbort, s'il en existe une. Par conséquent, assurez-vous que votre procédure d'événement OnTransactionAbort effectue tout le nettoyage nécessaire pour les actions qui ne sont pas prises en charge dans une transaction (notamment les actions de fichier).

Si vous voulez qu'un code soit traité sans tenir compte d'un appel à SetAbort, assurez-vous de le placer avant l'appel à SetAbort dans le script, ou testez la finalisation de la transaction après votre code dans le script.

 
SetComplete  
ObjectContext.SetComplete
 

Signale la finalisation correcte d'une transaction. Lorsqu'il est appelé, le code dans le code de la procédure d'événement OnTransactionCommit est traité, s'il existe.

Un appel à la méthode SetComplete depuis le script lui-même indique uniquement la réussite du script sur la page. Il n'annule pas l'échec possible du code au sein des composants référencés dans le script. Tous les composants transactionnels dans le script doivent avertir SetComplete afin que la transaction soit confirmée.

 
Paramètres

Aucun

 
Exemple

Reportez-vous à l'exemple de la section précédente, "SetAbort."

 
Remarques

Notez que l'appel à SetComplete ne signifie pas toujours que la transaction entière est finalisée. Chaque composant appelé depuis le script doit également appeler la méthode SetComplete de l'objet ObjectContext.

Si vous n'appelez pas explicitement la méthode SetComplete, la transaction est finalisée uniquement après le traitement de tout le code sans appel à SetAbort. Si aucun appel n'est effectué à SetAbort avant la fin du script, le code de la procédure d'événement OnTransactionCommit est traité, s'il existe, même si la méthode SetComplete est appelée.

 
OnTransactionAbort  
OnTransactionAbort( )
 

La procédure d'événement OnTransactionAbort est traitée immédiatement si la méthode SetAbort de l'objet ObjectContext est appelée explicitement en code de script ou par un composant serveur appelé depuis le code de script. Si aucun code n'appelle la méthode SetAbort, cette procédure d'événement n'est jamais traitée.

 
Paramètres

Aucun

 
Exemple
<% 

' The following code procedure is processed when the code in 
' the SetAbort method example is processed.
Sub OnTransactionAbort ( )
%>
   Your book sales transaction could not be completed.
   Either there was not sufficient inventory for your
   sale to be processed, or your credit card did not 
   go through.
<%
   ' Clean up any nontransactional actions here...

End Sub

%>
 
Remarques

Utilisez OnTransactionAbort pour nettoyer toute action non prise en charge que votre transaction réalise et que vous devez annuler si la transaction échoue. Cela inclut les modifications apportées aux variables (étendue de niveau session ou application), au registre et au système de fichiers. Notez, toutefois, que les composants de votre serveur effectuent un nettoyage à la fin des transactions.

Vous devez également utiliser l'événement OnTransactionAbort pour informer le client de l'échec de la transaction.

N'appelez pas les méthodes SetAbort ou SetCommit depuis la procédure d'événement OnTransactionAbort. Vous risquez d'insérer une boucle et de provoquer une perte de fonction dans votre application et/ou de perdre des données.

 
OnTransactionCommit  
OnTransactionCommit( )
 

La procédure d'événement OnTransactionCommit est traitée immédiatement si la méthode SetComplete de l'objet ObjectContext est appelée explicitement en code de script ou par un composant serveur appelé depuis le code de script. Elle est également appelée implicitement si aucun script sur la page en cours n'a appelé la méthode SetAbort.

 
Paramètres

Aucun

 
Exemple
<% 

' The following code procedure is processed when the code in 
' the SetComplete method example is processed.
Sub OnTransactionCommit ( )
%>
   Your book sales transaction was completed.
   Thank you for your sale.

<%
   Session("intTotalSales") = Session("intTotalSales") + 1

   ' Process any nontransactional code here...

End Sub

%>
 
Remarques

Vous pouvez utiliser la procédure d'événement OnTransactionCommit pour informer le client de la réussite de la transaction. Vous pouvez également l'utiliser pour du code que vous voulez traiter uniquement si la finalisation de la transaction réussit.

N'appelez pas les méthodes SetAbort ou SetCommit depuis la procédure d'événement OnTransactionCommit. Vous risquez d'insérer une boucle et de provoquer une perte de fonction dans votre application et/ou de perdre des données.